2017-03-17 12 views
1

그래서 Foo와 Bar 모델이 있습니다. Foo는 Foo에 속한 많은 바 및 바를 가지고 있습니다.Eloquent를 사용하여 날짜순으로 조인을 주문하는 방법은 무엇입니까?

나는 최신/최신 바에 의해 주문 된 Foos 컬렉션을 얻으려고합니다. 나는 dd($foos->lists('bar_created_at', 'id')); 내가 날짜가 최신 바 기록하지 않은 것을 볼 때

$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(); 

는하지만, 그들은 실제로 가장 오래된이다. 어떤 도움을 크게 감상 할 수

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 

: 여기

생성 된 SQL입니다. 나는 Laravel 5.0을 사용하고있다.

답변

1

당신은 MAX(bar.created_at)에 의해 foo.id 및 주문에 의해 그룹에 필요

$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(); 

그리고 당신은에 wehere 조건을 넣을 필요가 없습니다 조인 :

$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(); 

이것은 folowing 쿼리를 생성한다 :

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 
+0

당신은 남자입니다. 감사! 선택에 대해 설명하고 왜 부모 (foo) ID로 그룹화해야하는지 설명해 주시겠습니까? – Chris

+0

@Chris 나는 한 가지만 훑어 보았습니다. 이렇게하면 bar.id를 선택할 수 없습니다. 그래서 나는 그것을 select에서 제거했다. –

+1

@Chris 이것은 집계가 작동하는 방식입니다. 같은'foo.id' (또는 같은'bar.foo_id')를 가진 모든 행을 그룹화합니다. 그룹의 모든 행에서 'bar.created_at'에서 가장 큰 값만 선택합니다. –

관련 문제