如何使用Eloquent订购按日期列的连接?

时间:2017-03-17 17:17:29

标签: mysql laravel

所以我有模特Foo和Bar。 Foo有许多酒吧和酒吧属于Foo。

我正在尝试通过它最新/最新的Bar订购Foos系列。

$foos = Foo::select('foo.*', 'bar.id as bar_id', 'bar.created_at AS bar_created_at')
    ->join('bar', function($join) {
        $join->on('foo.id', '=', 'bar.foo_id')
            ->where('bar.baz', '=', 1)
            ->where('bar.foobaz', '=', 1);
    })
    ->groupBy('bar_id')
    ->orderBy('bar_created_at', 'desc')
    ->get();

但是当我dd($foos->lists('bar_created_at', 'id'));我看到日期不是最新的Bar记录时,它们实际上是最早的。

这是生成的SQL:

select `foo`.*, `bar`.`foo_id` as `foo_id`, `bar`.`created_at` as `bar_created_at` from `foo` inner join `bar` on `foo`.`id` = `bar`.`foo_id` and `bar`.`foo` = ? and `bar`.`foobaz` = ? where `foo`.`deleted_at` is null group by `foo_id` order by `bar_created_at` desc

非常感谢任何帮助。我正在使用Laravel 5.0。

1 个答案:

答案 0 :(得分:1)

您需要按foo.id进行分组,然后按MAX(bar.created_at)排序:

$foos = Foo::select('foo.*', DB::raw('MAX(bar.created_at) AS bar_created_at)')
    ->join('bar', function($join) {
        $join->on('foo.id', '=', 'bar.foo_id')
            ->where('bar.baz', '=', 1)
            ->where('bar.foobaz', '=', 1);
    })
    ->groupBy('foo.id')
    ->orderBy('bar_created_at', 'desc')
    ->get();

并且您不需要将无关条件放入连接中:

$foos = Foo::select('foo.*', DB::raw('MAX(bar.created_at) AS bar_created_at)')
    ->join('bar', 'foo.id', '=', 'bar.foo_id')
    ->where('bar.baz', '=', 1)
    ->where('bar.foobaz', '=', 1);
    ->groupBy('foo.id')
    ->orderBy('bar_created_at', 'desc')
    ->get();

这应该生成以下查询:

select `foo`.*,  MAX(bar.created_at) as bar_created_at
from `foo` 
inner join `bar` on `foo`.`id` = `bar`.`foo_id`
where `foo`.`deleted_at` is null 
  and `bar`.`foo`    = ?
  and `bar`.`foobaz` = ?
group by `foo.id` 
order by `bar_created_at` desc