2015-12-04 43 views
6

我正在開發具有以下雄辯車型Laravel雄辯模型如何從關係的表

  • 產品的hasMany一個laravel應用數據( '應用/ SKU', 'products_id')
  • SKU通過belongsTo( '應用/產品')

我有一個控制器 'ProductController的' 其中下面的代碼是可用的

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

我公開了RESTfull API,它將允許我的用戶獲得所有產品詳細信息(包括skus,運輸類型等)。

想,如果我有一個API GET:/產品

其獲取所有的產品細節將代碼中的一些下面

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

現在我的問題是什麼,是這個邏輯正確?在這種情況下,所有的邏輯都在控制器中,因爲我使用雄辯模型,每個表都有一個模型,並且關係在其中定義。有沒有一種方法可以讓我得到一個產品/相關模型的所有細節(產品的詳細信息(表1)+ SKU的詳細信息(表2)),而不是使用下面的

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

我非常新的laravel發展和雄辯模型。我將使用存儲庫模式進行開發,在那種情況下,aboe邏輯(Product + Sku組合)駐留在哪裏。

請幫忙。

回答

15

是的,你可以得到的產品和SKU的細節未做每次使用產品的一個附加查詢eager loading (這被稱爲典型的N + 1查詢問題其中N是產品的數量)

假設你ProductSku模式模型之間的關係是:

產品

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

要將產品數據與sku數據一起使用,您可以使用with方法。在你的控制器:

控制器

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

然後,在你的意見,你可以得到的信息是這樣的:

查看

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

存儲庫問題:如果你想使用一個版本庫,你可以將代碼的雄辯訪問部分放入庫。因此,舉例來說,你可以有在倉庫裏的這個方法:

ProductRepository

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

那麼你可以使用你的資料庫在你的控制器:

控制器

//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

感謝您的詳細解答。我的答案還有一個問題,我的數據驗證發生在哪裏?它是否在控制器或存儲庫中,並且可以將庫作爲類似codeigniter的庫嗎? – Ajeesh

+0

@ user34305:要驗證數據,您可以採用不同的方式進行驗證:在您的控制器,模型或使用特定類中,這取決於您的需求和偏好:選中[此處](http://laravel.com/ docs/5.1/validation)來獲取更多信息。對於codeigniter部分我不能幫助,因爲我不使用它:) – Moppo

+1

謝謝你。我正在接受你的回答。 :) – Ajeesh

1

如果我正確理解你的問題,你可以使用ea ger loading。

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

這會給你一個產品陣列,每個產品對象都有一個skus數組。

0

如果使用的存儲庫模式像這樣使用。

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