web-dev-qa-db-fra.com

Laravel modèle éloquent comment obtenir des données de la table de la relation

Je développe une application laravel qui a les modèles éloquents suivants

  • Nom du produit ('App/Sku', 'products_id')
  • Réf. Apparto ('App/Produit')

J'ai un contrôleur 'ProductController' où le code suivant est disponible

public function index()
{    
    $products = Product::all();
    foreach($products as $product){
            $products_id = $product->products_id;
    }
}

J'expose l'API RESTfull qui permettra à mes utilisateurs d'obtenir tous les détails du produit (y compris les skus, les types d'expédition, etc.).

Supposons que si j'ai une API GET:/products

Le code qui va chercher tous les détails du produit sera ce que ce qui suit

public function index()
{              
      $products = Product::all();
      foreach($products as $product){
          $products_id = $product->products_id;
          $skus_data = Product::find($products_id)->skus;
      }
        // Now I have both the product details + skus which I can bundle into an array/json.
}

Ma question est la suivante: cette logique est-elle appropriée? Dans ce cas, toutes les logiques sont dans le contrôleur depuis que j’utilise des modèles éloquents, j’ai un modèle pour chaque table et les relations y sont définies. Est-il possible d'obtenir tous les détails d'un produit/modèle associé (détails des produits (dans le tableau 1) + détails du sku (dans le tableau 2)) au lieu d'utiliser les éléments ci-dessous?

foreach($products as $product){
    $products_id = $product->products_id;
    $skus_data = Product::find($products_id)->skus;
}

Je suis assez nouveau pour le développement de laravel et les modèles éloquents. Je vais utiliser un modèle de référentiel pour le développement et dans ce cas, où réside la logique ci-dessus (combinaison produit/sku).

S'il vous plaît aider.

9
Ajeesh

Oui, vous pouvez obtenir les détails des produits et skus sans faire une requête supplémentaire par produit en utilisant eager loading (on parle de problème de requête N + 1} _ typique où N est le nombre de produits) 

Supposons que la relation entre vos modèles Product et Sku soit:

Produit

public function skus()
{
    return hasMany('App/Sku','products_id');
}

Pour récupérer les données de produits avec les données de sku, vous pouvez utiliser la méthode with. Dans votre contrôleur:

Manette

 $products = Product::with('skus')->get();

Ensuite, à votre avis, vous pouvez obtenir les informations de cette façon:

Vue

foreach ($products as $product) 
{
     //$product->skus is a collection of Sku models
     dd( $product->skus );
}

Pour la question sur le référentiel: si vous voulez utiliser un référentiel, vous pouvez placer la partie éloquent-access de votre code dans le référentiel. Ainsi, par exemple, vous pourriez avoir cette méthode dans le référentiel:

ProductRepository

public function getProductsData() 
{
    //access eloquent from the repository
    return Product::with('skus')->get();    
} 

alors vous pouvez utiliser votre référentiel dans votre contrôleur:

Manette

//inject the repository in the controller
public function __construct( ProductRepository $productRepo )
{
    $this->productRepo = $productRepo;
}

//use the injected repository to get the data
public function index()
{
    $products = this->productRepo->getProductsData();
}
20
Moppo

Si je comprends bien votre question, vous pouvez utiliser le chargement rapide.

 public function index()
 {
    $products = Product::with('skus')->get();
 }

Cela vous donnera un tableau de produits qui ont un tableau de skus dans chaque objet produit.

1
Fester

Si utilisé, le modèle de référentiel est utilisé comme ceci.

public function index()
    {
      $data=$this->passportRepository->with('user')->findWhere( ['id'=>1]);
}
0
Kaushik Shrimali