繁体   English   中英

Laravel eloquent 模型如何从关系表中获取数据

[英]Laravel eloquent model how to get data from relationship's table

我正在开发一个 Laravel 应用程序,它具有以下雄辩的模型

  • 产品 hasMany('App/Sku','products_id')
  • Sku属于('应用程序/产品')

我有一个控制器“ProductController”,其中提供了以下代码

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

我正在公开 RESTfull API,它将允许我的用户获取所有产品详细信息(包括 skus、运输类型等)。

假设我有一个 API GET : /products

获取所有产品详细信息的代码如下

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 逻辑(产品+Sku 组合)位于何处。

请帮忙。

是的,您可以获取产品和 skus 的详细信息,而无需使用预先加载对每个产品进行额外查询(这称为典型的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 );
}

对于存储库问题:如果您想使用存储库,您可以将代码的 eloquent-access 部分放在存储库中。 因此,例如,您可以在存储库中使用此方法:

产品库

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

如果我正确理解您的问题,您可以使用预先加载。

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

这将为您提供一系列产品,每个产品对象中都有一个 skus 数组。

如果使用存储库模式,请这样做。

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

你可以试试这个:

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

}

这将为您提供对象形式的确切结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM