调用关系时急切加载

时间:2017-09-13 12:12:30

标签: php laravel laravel-5

我在我的数据库中有这些表,它们是相关的

category
products
product_images
product_categories 

在我有的分类模型中(请忽略语法错误)

function ProductCategoryLatest()
{
    return $this->hasMany('App\ProductCategory')->limit(6);
}

在我的ProductCategory模型中

   function Product(){
       return $this->belongsTo('App\Product')->where('hidden' , 0 );
   }
我在产品型号中

   function Image(){
       return $this->hasMany('App\Image');
   }

我想在我的索引中显示每个类别的最后6个产品 所以我从控制器读取并发送类别到我的视图

$categories = Category::all();
return view('index' , compact('category'));

在视图中,我有类似

的内容
@foreach($categories as $category)

     {{$category->title }}  products :

     @foreach($category->ProductCategoryLatest as $product_category )

             {{$product_category->Product->title }}

             @foreach($product_category->Product->Image as $image  )
                 <img src="{{$image->title}}">
             @endforeach


     @endforeach

@endforeach

你可以想象有很多查询可以通过急切加载来避免,但问题是限制6正在破坏它

就像我写的查询一样

$categories = Category::with('ProductCategoryLatest' , 'ProductCategoryLatest.Product' , 'ProductCategoryLatest.Product.Image')->get();

我的数据库中有5个类别,查询类似于

select * from product_categories  where category_id  in (1,2,3,4,5) LIMIT 6 

所以如果id为1的类别在product_categories中有10行,则所有6个返回的行都属于类别1,其余的将返回空,即使它们在DB中有关联的行但是限制6会使它们显示为在product_categories中没有任何行

所以基本上我需要在关系类似

的视图中加载
@foreach($categories as $category)


    @foreach($category->ProductCategoryLatest->with('Product' , 'Product.Image' ) as $product_category )

    @endforeach


@endforeach

顺便说一下,我知道我可以在控制器中做一些杂耍,比如

$new_categories = [] ;
foreach ($categories as $category )
{
    $ProductCategoryLatest  = ProductCategoryLatest::where('category_id' , $category->id )->with('Product' , 'Product.Image')->get();
    $category->ProductCategoryLatest = $ProductCategoryLatest ;
    $new_categories[] = $category ;
}

但我想知道是否有更清洁的解决方案?

总结我的关系

class Category extends Model { 
    function ProductCategoryLatest()
    {
        return $this->hasMany('App\ProductCategory')->limit(6);
    }
}

关于此代码

$categories = Category::with('ProductCategoryLatest')->get();

会生成此查询

select * from product_categories  where category_id  in (1,2,3,4,5) LIMIT 6 

但是我希望每个category_id有6行,而不是像所有

那样6
category_id= 1 -> 6 row 
category_id= 2 -> 6 row
category_id= 3 -> 6 row

...

1 个答案:

答案 0 :(得分:0)

好的,您可以docs

使用take()skip()
$categories = Category::with('ProductCategoryLatest' ,
'ProductCategoryLatest.Product' , 'ProductCategoryLatest.Product.Image')
->skip(0)->take(6)->get();