如何在Laravel的Eloquent ORM中按数据透视表数据排序

2022-08-30 14:40:17

在我的数据库中,我有:

  • tops桌子
  • posts桌子
  • tops_has_posts桌子。

当我在桌子上检索顶部时,我还检索与顶部相关的。但是,如果我想按特定顺序检索这些帖子怎么办?所以我在我的数据透视表中添加了一个字段,我试图使用Eloquent按结果排序,但它不起作用。topspostsrangetops_has_posts

我试试这个:

$top->articles()->whereHas('articles', function($q) {
    $q->orderBy('range', 'ASC');
})->get()->toArray();

还有这个:

$top->articles()->orderBy('range', 'ASC')->get()->toArray();

两者都是绝望的尝试。

提前感谢您。


答案 1

有两种方法 - 一种使用指定 ,另一种使用 Eloquent 别名(如果您使用):table.fieldpivot_fieldwithPivot('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

这将起作用,因为 Eloquent 将 中提供的所有字段别名为 。withPivotpivot_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();

这将对相关查询进行排序。

注意:不要以这种方式命名事物会让你的生活变得困难。 不一定,我会使用一个或另一个名字,除非真的需要这个。postsarticles


答案 2

对于 Laravel 8.17.2+,您可以使用 .::orderByPivot()

https://github.com/laravel/framework/releases/tag/v8.17.2


推荐