【问题标题】:Making function for eager loading in laravel在 laravel 中制作用于急切加载的功能
【发布时间】:2020-12-26 00:09:22
【问题描述】:

我分配了三个级别的类别来添加产品PrimarySecondaryFinal 类别。添加产品时,用户可以在 category_id 字段中保存最终的类别 ID。现在我想访问与Primary 类别相关的最终类别的产品。

假设我有 Electronic 主要类别,在此之下,我有诸如 MobilesCameraDesktop 等次要类别strong> 再次在 Secondary 类别中,我有 Final 类别,例如移动设备中的 SamsungGalaxyCanonDSLR 里面的相机等等。现在我希望能够获取 Primary 类别中的所有产品。

我有以下代码用于预加载:

$electronic_accessories = "Electronic Device";
  
$electronic_accessories_product = Product::whereHas('productCategory', function($query) 
          use($electronic_accessories) {
              $query->whereHas('secondaryCategory', function($query) 
              use($electronic_accessories)  { 
                  $query->whereHas('primaryCategory', function($query) 
                  use($electronic_accessories){
                      $query->where('name', $electronic_accessories);
                  });
              });
        })
        ->with([
          'productCategory' => function($query) use($electronic_accessories) {
              $query->whereHas('secondaryCategory', function($query) use($electronic_accessories)
                { 
                  $query->whereHas('primaryCategory', function($query) 
                    use($electronic_accessories){
                        $query->where('name', $electronic_accessories);
                    });
                });
          },
          'productCategory.secondaryCategory'=> function($query) use($electronic_accessories)
          {
                  $query->whereHas('primaryCategory', function($query) 
                    use($electronic_accessories){
                        $query->where('name', $electronic_accessories);
                    });
          },
          'productCategory.secondaryCategory.primaryCategory' =>                   
            function($query) use($electronic_accessories) {
                  $query->where('name', $electronic_accessories);
          }])->take(2)->get();

此代码运行良好,但我不想每次从Primary 类别中获取产品时都重复此代码。我想将其用作功能。我尝试在Product 模型中使用getPrimaryProduct() 制作函数,但它说

在 null 上调用成员函数 getPrimaryProduct()

【问题讨论】:

    标签: php laravel relationship eager-loading eloquent-relationship


    【解决方案1】:

    你必须使用范围:

    public function scopePrimary($query){
       return $query->whereHas('productCategory', function($query) 
              use($electronic_accessories) {
                  $query->whereHas('secondaryCategory', function($query) 
                  use($electronic_accessories)  { 
                      $query->whereHas('primaryCategory', function($query) 
                      use($electronic_accessories){
                          $query->where('name', $electronic_accessories);
                      });
                  });
            })
            ->with([
              'productCategory' => function($query) use($electronic_accessories) {
                  $query->whereHas('secondaryCategory', function($query) use($electronic_accessories)
                    { 
                      $query->whereHas('primaryCategory', function($query) 
                        use($electronic_accessories){
                            $query->where('name', $electronic_accessories);
                        });
                    });
              },
              'productCategory.secondaryCategory'=> function($query) use($electronic_accessories)
              {
                      $query->whereHas('primaryCategory', function($query) 
                        use($electronic_accessories){
                            $query->where('name', $electronic_accessories);
                        });
              },
              'productCategory.secondaryCategory.primaryCategory' =>                   
                function($query) use($electronic_accessories) {
                      $query->where('name', $electronic_accessories);
              }]);
    }
    

    然后使用它:

    Product::primary()->get();
    

    【讨论】:

      猜你喜欢
      • 2017-05-30
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多