我试图为每个类别获得5个帖子,因此我进行了一些搜索并最终在此Getting n Posts per category 但是当我使用范围时,我得到一个奇怪的调用模型未定义的关系,但它一切正常如果我不使用范围。这是类别模型
//Relationship with posts
public function posts(){
return $this->hasMany('App\Post');
}
scopeNPerGroup
public function scopeNPerGroup($query, $group, $n = 10)
{
// queried table
$table = ($this->getTable());
// initialize MySQL variables inline
$query->from( \DB::raw("(SELECT @rank:=0, @group:=0) as vars, {$table}") );
// if no columns already selected, let's select *
if ( ! $query->getQuery()->columns)
{
$query->select("{$table}.*");
}
// make sure column aliases are unique
$groupAlias = 'group_'.md5(time());
$rankAlias = 'rank_'.md5(time());
// apply mysql variables
$query->addSelect(\DB::raw(
"@rank := IF(@group = {$group}, @rank+1, 1) as {$rankAlias}, @group := {$group} as {$groupAlias}"
));
// make sure first order clause is the group order
$query->getQuery()->orders = (array) $query->getQuery()->orders;
array_unshift($query->getQuery()->orders, ['column' => $group, 'direction' => 'asc']);
// prepare subquery
$subQuery = $query->toSql();
// prepare new main base Query\Builder
$newBase = $this->newQuery()
->from(\DB::raw("({$subQuery}) as {$table}"))
->mergeBindings($query->getQuery())
->where($rankAlias, '<=', $n)
->getQuery();
// replace underlying builder to get rid of previous clauses
$query->setQuery($newBase);
}
使用关系调用Npergroup
public function latestposts()
{
return $this->posts()->latest()->nPerGroup('category_id', 5);
}
模型后关系
//Post belongs to Category
public function category(){
return $this->belongsTo('App\Category');
}
在我的类别控制器中,我通过
呼叫latestposts
$categories = Category::with('latestposts')->get();
但我收到错误:Call to undefined relationship on model
我想要的是: 获得每个类别的N个帖子,但此时我完全丢失了。任何帮助将不胜感激
参考: Tweaking Eloquent relations – how to get N related models per parent ?
答案 0 :(得分:1)
我根据您的目的给出了这个答案,您希望每个类别有5个帖子。 所以你有分类模型和后期模型。
在类别模型中,您与此
的发布模型有关系 //Relationship with posts
public function posts(){
return $this->hasMany('App\Post');
}
在发布模型中,您与此类类别模型有关系
//Post belongs to Category
public function category(){
return $this->belongsTo('App\Category');
}
我向您展示您已经完成SQL查询的问题。
而不是那样,你可以使用两种方法
1)在 eagar 加载时提供条件
$categories = Category::with(['posts' => function ($query) {
$query->orderBy('created_at', 'desc')->take(5);
}])->get();
注意:此方法仅在您使用
first()
方法仅使用一个父子结果时才有效。每个类别获得 n个帖子使用此功能。
首先,您可以使用
检索所有类别$categories = Category::all();
然后您可以使用foreach循环,并且在所有 $ category 中,您必须在其中指定新属性,例如 latestposts ,
foreach ($categories as $category)
{
$category->latestposts = $category->posts()->orderBy('created_at','desc')->take(5)->get();
}
在此foreach循环之后,您将获得所有类别中的最新5篇帖子。
在您的代码中尝试此操作并对您的查询和评论进行评论。