我在我的数据库中有这些表,它们是相关的
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行,而不是像所有
那样6category_id= 1 -> 6 row
category_id= 2 -> 6 row
category_id= 3 -> 6 row
...
答案 0 :(得分:0)
好的,您可以docs
使用take()
和skip()
$categories = Category::with('ProductCategoryLatest' ,
'ProductCategoryLatest.Product' , 'ProductCategoryLatest.Product.Image')
->skip(0)->take(6)->get();