【问题标题】:Laravel Eloquent order by using relation dataLaravel Eloquent 使用关系数据排序
【发布时间】:2017-07-12 07:03:39
【问题描述】:

我有以下 2 个表:

Cars
----
id | created_at

and

Repaired
id | cars_id | updated_at

我想显示所有汽车,由created_at desc 订购,但也由updated_atRepaired 数据透视表订购。修复后可以有很多特定cars_id的条目。

所以如果carA 是created_at 2017-02-20carB 是created_at 2016-01-10,但是为carB 修复的updated_at2017-02-22 上,我想在@ 之前显示carB 987654334@,因为关系“较新”。

我也不想从关系表中加载数据。

我尝试了以下方法:

$cars = $model->load(['repaired' => function($query) {
    return $query->orderBy('updated_at', 'desc');
}])->orderBy('created_at', 'desc');

$model->join('repaired', 'repaired.cars_id', '=', 'cars.id')
      ->orderBy('repaired.updated_at', 'desc')
      ->orderBy('cars.created_at', 'desc')
      ->select('cars.*');

^ 此查询返回已修复表中的所有项目,即使 updated_at 字段为 NULL。而且我无法将它们分组。

【问题讨论】:

  • 到目前为止你有没有尝试过?

标签: laravel sql-order-by


【解决方案1】:
 $popular_posts = Post::withCount('favorite_to_users')
            ->orderBy('view_count', 'desc')
            ->orderBy('favorite_to_users_count', 'desc')
            ->take(5)->get();

【讨论】:

    【解决方案2】:

    您可以使用 Eloquent 中的touch parent timestamps 功能,为汽车更新updated_at,每次更新已修复。

    在您的已修复模型中添加以下行:

    protected $touches = ['car'];
    

    这是假设你的关系方法当然被命名为car()

    那么你可以这样做:

    Cars::orderBy('updated_at');
    

    每次添加或更新Repaired 表中的一行时,car 关系中指定的汽车将其updated_at 设置为同一时间。这样你就可以点菜了。

    【讨论】:

      猜你喜欢
      • 2017-08-22
      • 2021-01-25
      • 2015-07-05
      • 2014-06-25
      • 1970-01-01
      • 2017-03-25
      • 2017-10-28
      • 2021-07-14
      • 2015-03-27
      相关资源
      最近更新 更多