2015-12-04 22 views
6

Sto sviluppando un'applicazione laravel che ha i seguenti modelli eloquentilaravel modello eloquenti come ottenere i dati dalla tabella del rapporto

  • hasMany del prodotto ('App/Sku', 'products_id')
  • Sku belongTO ('App/prodotto')

ho un regolatore di 'ProductController', dove il seguente codice è disponibile

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

Sto esponendo l'API RESTfull che consentirà ai miei utenti di ottenere tutti i dettagli del prodotto (inclusi skus, tipi di spedizione ecc.).

Supponiamo che se ho un API GET:/prodotti

Il codice che recupera tutti i dettagli del prodotto saranno un po 'quello che il seguente

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

Ora la mia domanda è, è questa logica corretta ? In questo caso tutte le logiche sono nel controller poiché im utilizzando modelli eloquenti ho un modello per ogni tabella e le relazioni sono definite al suo interno. C'è un modo per ottenere tutti i dettagli di un/modello associato prodotto (Particolari dei prodotti (in tabella 1) + dettagli SKU (nella tabella 2)) invece di usare il seguito

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

Sono abbastanza nuovo a sviluppo di laravel e modelli eloquenti. Utilizzerò il pattern di repository per lo sviluppo e in tal caso dove risiede la logica di aboe (combinazione prodotto + Sku).

Si prega di aiutare.

risposta

15

Sì, è possibile ottenere i dettagli dei prodotti e SKU senza fare una query aggiuntiva per prodotto utilizzando eager loading (questo è indicato come il tipico N + 1 problema di query dove N è il numero dei prodotti)

si supponga che la relazione tra il modello di modelli Product e Sku è:

prodotto

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

Per recuperare i dati dei prodotti insieme ai dati di sku è possibile utilizzare il metodo with.Nel vostro controller:

controller

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

Poi, nel vostro punto di vista, è possibile ottenere le informazioni in questo modo:

View

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

Per la domanda repository : se si desidera utilizzare un repository, è possibile inserire la parte di accesso eloquente del codice all'interno del repository repository. Così, per esempio si potrebbe avere questo metodo all'interno del repository:

ProductRepository

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

quindi è possibile utilizzare il repository nel controller:

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

Grazie per la risposta dettagliata. Un'altra domanda che ho dalla tua risposta è dove avvengono tutte le convalide dei miei dati? Si trova nel controller o nel repository e posso trattare un repository come una libreria come in codeign? – Ajeesh

+0

@ user34305: per convalidare i dati è possibile farlo in modo diverso: nel controller, nei modelli o utilizzando classi specifiche, dipende dalle esigenze e dalle preferenze: controllare [qui] (http://laravel.com/ docs/5.1/validation) per ottenere maggiori informazioni. Per la parte del codeigniter non posso fare a meno di non usarlo :) – Moppo

+1

Grazie amico. Im contrassegnando la tua risposta accettata. :) – Ajeesh

1

Se ho capito bene la tua domanda, puoi usare ea caricamento ger.

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

Questo vi darà una serie di prodotti che hanno un array skus in ogni oggetto del prodotto.

0

Se il modello di archivio utilizzato è stato utilizzato in questo modo.

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