【问题标题】:Laravel eloquent model how to get data from relationship's tableLaravel 雄辩模型如何从关系表中获取数据
【发布时间】:2016-03-09 00:39:14
【问题描述】:

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

  • Product hasMany('App/Sku','products_id')
  • Sku 属于TO('App/Product')

我有一个控制器“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 组合)所在的位置。

请帮忙。

【问题讨论】:

    标签: php laravel laravel-5 eloquent repository-pattern


    【解决方案1】:

    你可以试试这个:

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

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

    【讨论】:

    • 本网站上通常不赞成仅使用代码的答案。您能否编辑您的答案以包含一些 cmets 或对您的代码的解释?解释应该回答这样的问题:它有什么作用?它是如何做到的?它去哪儿了?它如何解决OP的问题?请参阅:How to anwser。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      是的,您可以使用eager loading 获取产品和 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 部分放在存储库中。因此,例如,您可以在存储库中使用此方法:

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

      【讨论】:

      • 感谢您的详细回答。我从您的回答中得到的另一个问题是我的所有数据验证都发生在哪里?它是在控制器还是存储库中,我可以像在 codeigniter 中一样将存储库视为库吗?
      • @user34305 :要验证数据,您可以采用不同的方式:在控制器中、模型中或使用特定类,这取决于您的需求和偏好:检查 here 以获取更多信息。对于codeigniter部分我无能为力,因为我不使用它:)
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2019-07-16
        • 2019-02-12
        • 2013-06-04
        • 2016-11-26
        • 1970-01-01
        • 2020-12-02
        • 2021-03-10
        • 2018-02-19
        相关资源
        最近更新 更多