Implémenter des filtres et la pagination à l'aide de Laravel Eloquent
P粉010967136
P粉010967136 2023-11-12 18:42:35
0
1
853

J'essaie de créer une API qui renverra tous les enregistrements clients d'une base de données. Mais cela fournit des fonctionnalités de pagination et de filtrage. ,

La fonction de filtre est un paramètre de requête facultatif. Il n'est donc pas nécessaire de l'inclure dans les paramètres de la requête.

Mais j'ai un problème pour faire ça.

Voici la méthode d'indexation dans le fichier CustomerController :

public function index(Request $request)
    {
        // Get how many item per page
        $itemPerPage = $request->query('per_page');

        // SQL Query 
        $customers = Customer::all();

        // Filter data
        if (!empty($request->name)) {
            $customers = $customers->where('name', '=', $request->name);
        }

        // Return the result as JSON
        return new CustomerCollection($customers->paginate($itemPerPage));
    }

Ou existe-t-il une meilleure façon de combiner la fonctionnalité de filtrage facultative avec la pagination ?

Merci.

P粉010967136
P粉010967136

répondre à tous(1)
P粉268284930

Votre problème principal est cette ligne :

$customers = Customer::all();

all() 方法立即将所有 customers 记录作为 Collection 返回,该集合没有 ->paginate( ) Méthodes : https://laravel.com/docs/9.x/collections#available-methods.

Pour sélectionner un lien, utilisez la clause ->query() 方法或 ->when() :

Utilisation ::query() 代替 ::all() :

$itemPerPage = $request->query('per_page');

// SQL Query 
$customers = Customer::query();

// Filter data
if (!empty($request->name)) {
    $customers = $customers->where('name', '=', $request->name);
}

// Return the result as JSON
return new CustomerCollection($customers->paginate($itemPerPage));

Utilisez la clause ->when() :

$itemPerPage = $request->query('per_page');

$customers = Customer::when(!empty($request->name), function ($query) use ($request) {
  $query->where('name', '=', $request->name);
});

return new CustomerCollection($customers->paginate($itemPerPage));
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal