2015-12-04 4 views
6

ich eine Laravel Anwendung entwickle, die folgende eloquent Modelle hatLaravel eloquent Modell, wie Daten von Beziehung erhalten Tisch

  • Produkt hasMany ('App/Sku', 'products_id')
  • sku belongTO ('App/Produkt')

ich habe einen Controller 'Product', wo der folgende Code verfügbar ist

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

Ich stelle RESTfull-API zur Verfügung, die es meinen Benutzern ermöglicht, alle Produktdetails (einschließlich Skus, Versandarten usw.) zu erhalten.

Angenommen, wenn ich eine API GET haben:/Produkte

Der Code, der alle Details Produkt holt werden, was einige der folgenden

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. 
} 

Nun meine Frage ist, diese Logik richtig ist ? In diesem Fall befinden sich alle Logiken in der Steuerung, da ich mit beredten Modellen ein Modell für jede Tabelle verwende und die Beziehungen darin definiert sind. Gibt es eine Weise, die ich alle Details eines Produkts/verknüpften Modell bekommen (Produkte Details (in Tabelle 1) + Sku Details (in Tabelle 2)) anstatt der unter

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

ich ziemlich neu bin Laravel-Entwicklung und eloquente Modelle. Ich werde Repository-Muster für die Entwicklung verwenden und in diesem Fall, wo sich die Aboe-Logik (Product + Sku combining) befindet.

Bitte helfen Sie.

Antwort

15

Ja, können Sie die Details der Produkte und skus erhalten, ohne eine zusätzliche Abfrage pro Produkt machen mit eager loading (dies als die typische N + 1 Abfrage Problem bezeichnet wird wobei N die Anzahl der Produkte ist)

Angenommen, die die Beziehung zwischen Ihrem Product und Sku Modelle Modell:

Produkt

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

Um die Produktdaten zusammen mit den SKU-Daten abzurufen, können Sie die Methode with verwenden.In Ihrem Controller:

-Controller

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

Dann in Ihren Ansichten, können Sie die Informationen auf diese Weise erhalten:

Ansicht

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

Für die Repository Frage : Wenn Sie ein Repository verwenden möchten, können Sie den eloquent-access-Teil Ihres Codes in das Verzeichnis einfügen Repository. So zum Beispiel könnten Sie diese Methode innerhalb des Repository:

ProductRepository

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

dann können Sie Ihr Repository in Ihrem Controller verwenden:

-Controller

//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(); 
} 
+0

Danke für die detaillierte Antwort. Eine weitere Frage, die ich aus Ihrer Antwort habe, ist, wo alle meine Datenvalidierungen stattfinden. Ist es in der Steuerung oder im Repository und kann ich ein Repository als eine Bibliothek wie in Codeigniter behandeln? – Ajeesh

+0

@ user34305: Um die Daten zu validieren, können Sie dies auf verschiedene Arten tun: in Ihrem Controller, in Ihren Modellen oder in bestimmten Klassen, hängt es von Ihren Bedürfnissen und Präferenzen ab: [hier] (http://laravel.com/ Dokumentation/5.1/Validierung), um weitere Informationen zu erhalten. Für den Codeigniterteil kann ich nicht helfen, da ich es nicht verwende :) – Moppo

+1

Danke Mann. Ich markiere deine Antwort akzeptiert. :) – Ajeesh

1

Wenn ich deine Frage richtig verstanden habe, kannst du ea benutzen Ger Laden.

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

Dies gibt Ihnen eine Reihe von Produkten, die ein Skus-Array in jedem Produktobjekt haben.

0

Wenn verwendet Repository Muster so wie diese verwendet.

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