2015-12-04 19 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]); 
}