首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Laravel的雄辩ORM中按透视表数据排序

如何在Laravel的雄辩ORM中按透视表数据排序
EN

Stack Overflow用户
提问于 2014-10-24 23:22:46
回答 6查看 29K关注 0票数 23

在我的数据库中,我有:

  • tops Table
  • posts Table
  • tops_has_posts表。

当我检索tops表上的一个顶部时,我还检索了与该顶部相关的posts。但是,如果我想以某种顺序检索这些帖子呢?因此,我在透视表tops_has_posts中添加了一个range字段,并尝试使用Eloquent按结果排序,但它不起作用。

我试试这个:

代码语言:javascript
复制
$top->articles()->whereHas('articles', function($q) {
    $q->orderBy('range', 'ASC');
})->get()->toArray();

还有这个:

代码语言:javascript
复制
$top->articles()->orderBy('range', 'ASC')->get()->toArray();

这两个都是孤注一掷的尝试。

提前谢谢你。

EN

回答 6

Stack Overflow用户

发布于 2014-10-25 13:06:47

有两种方法-一种是指定table.field,另一种是在使用withPivot('field')的情况下使用口才别名pivot_field

代码语言:javascript
复制
// 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

现在,通用解决方案:

代码语言:javascript
复制
$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,除非真的需要这样做,否则我会使用其中一个名称。

票数 27
EN

Stack Overflow用户

发布于 2018-04-23 22:49:30

在Laravel 5.6+中(对旧版本不太确定),使用下面的代码会很方便:

代码语言:javascript
复制
public function articles()
{
  return $this->belongsToMany('Article', 'tops_has_posts')->withPivot('range')->orderBy('tops_has_posts.range');
}

在这种情况下,无论何时调用articles,都会根据range属性自动对它们进行排序。

票数 20
EN

Stack Overflow用户

发布于 2018-06-09 03:19:32

在Laravel 5.4中,我有以下关系,它在belongsToMany of Job模型的Set模型中工作良好:

代码语言:javascript
复制
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打印输出如下所示:

代码语言:javascript
复制
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
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26551078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档