在我的数据库中,我有:
tops
Tableposts
Tabletops_has_posts
表。当我检索tops
表上的一个顶部时,我还检索了与该顶部相关的posts
。但是,如果我想以某种顺序检索这些帖子呢?因此,我在透视表tops_has_posts
中添加了一个range
字段,并尝试使用Eloquent按结果排序,但它不起作用。
我试试这个:
$top->articles()->whereHas('articles', function($q) {
$q->orderBy('range', 'ASC');
})->get()->toArray();
还有这个:
$top->articles()->orderBy('range', 'ASC')->get()->toArray();
这两个都是孤注一掷的尝试。
提前谢谢你。
发布于 2014-10-25 13:06:47
有两种方法-一种是指定table.field
,另一种是在使用withPivot('field')
的情况下使用口才别名pivot_field
// if you use withPivot
public function articles()
{
return $this->belongsToMany('Article', 'tops_has_posts')->withPivot('range');
}
// then: (with not whereHas)
$top = Top::with(['articles' => function ($q) {
$q->orderBy('pivot_range', 'asc');
}])->first(); // or get() or whatever
这将会起作用,因为雄辩的别名为withPivot
中提供的所有字段作为pivot_field_name
。
现在,通用解决方案:
$top = Top::with(['articles' => function ($q) {
$q->orderBy('tops_has_posts.range', 'asc');
}])->first(); // or get() or whatever
// or:
$top = Top::first();
$articles = $top->articles()->orderBy('tops_has_posts.range', 'asc')->get();
这将对相关查询进行排序。
注意:不要因为这样命名而让你的生活变得困难。posts
不一定是articles
,除非真的需要这样做,否则我会使用其中一个名称。
发布于 2018-04-23 22:49:30
在Laravel 5.6+中(对旧版本不太确定),使用下面的代码会很方便:
public function articles()
{
return $this->belongsToMany('Article', 'tops_has_posts')->withPivot('range')->orderBy('tops_has_posts.range');
}
在这种情况下,无论何时调用articles
,都会根据range
属性自动对它们进行排序。
发布于 2018-06-09 03:19:32
在Laravel 5.4中,我有以下关系,它在belongsToMany
of Job
模型的Set
模型中工作良好:
public function jobs()
{
return $this->belongsToMany(Job::class, 'eqtype_jobs')
->withPivot(['created_at','updated_at','id'])
->orderBy('pivot_created_at','desc');
}
上面的关系返回指定的Set
已被联接的所有jobs
,按数据透视表(eqtype_jobs
)的字段created_at
DESC排序。
$set->jobs()->paginate(20)
的SQL打印输出如下所示:
select
`jobs`.*, `eqtype_jobs`.`set_id` as `pivot_set_id`,
`eqtype_jobs`.`job_id` as `pivot_job_id`,
`eqtype_jobs`.`created_at` as `pivot_created_at`,
`eqtype_jobs`.`updated_at` as `pivot_updated_at`,
`eqtype_jobs`.`id` as `pivot_id`
from `jobs`
inner join `eqtype_jobs` on `jobs`.`id` = `eqtype_jobs`.`job_id`
where `eqtype_jobs`.`set_id` = 56
order by `pivot_created_at` desc
limit 20
offset 0
https://stackoverflow.com/questions/26551078
复制相似问题