recherche

Maison  >  Questions et réponses  >  le corps du texte

Implémenter des filtres et la pagination à l'aide de Laravel Eloquent

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粉010967136P粉010967136470 Il y a quelques jours940

répondre à tous(1)je répondrai

  • P粉268284930

    P粉2682849302023-11-13 10:57:10

    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));

    répondre
    0
  • Annulerrépondre