2013-04-20 3 views
3

홈페이지의 사이드 바에 표시 할 마지막 게시물이있는 사용자 (저자는 최대 5-6 명의 저자가 있음)를 얻으려고합니다. 이후 그들은 성능 문제로 인해 SQL 쿼리의 양을 줄이기 위해 노력하고 홈페이지에 나열됩니다. 나는 노력했다.마지막 게시물이있는 모든 사용자를 검색하는 방법

$users=User::with(array('posts'=>function($query){ 

     $query->take(1); 
    }))->get(); 

그러나 모든 사용자에 대해 하나가 아닌 총 하나의 게시물 만 가져옵니다. 그리고 내 SQL 지식은 제한되어 있습니다.

Eloquent ORM, 쿼리 작성기 또는 원시 SQL 쿼리를 사용하여 내 포블을 해결하려면 어떻게해야합니까?

+0

사용자를 먼저 얻은 다음 마지막 게시물을 가져 오기 위해 반복해야합니다. 그래서 "SQL 쿼리 수 = 1 + 사용자 수". 못생긴 것 같습니다 :/ – Hasan

+0

쿼리에 SQL을 사용할 수 있습니까? 그렇지 않은 경우 태그로 제거해야합니다. –

+0

할 수 있습니다. 그래서 그것을 넣었습니다. 여기에있는 질문 : http : //stackoverflow.com/questions/10277115/select-newest-record-group-by-username-in-sql-server-2008 내 것 같다. 나는 그것에 대해 조사하고있다 – Hasan

답변

4

해결책은 User 모델 주문에서 created_at 컬럼으로 hasOne 관계를 정의하는 것입니다.

public function lastPost() 
{ 
    return $this->hasOne('Post')->orderBy('created_at', 'desc'); 
} 

그런 다음 쿼리가 그럴 것입니다.

return $this->hasOne('Post')->select('id', 'user_id', 'title', 'created_at')->orderBy('created_at', 'desc'); 

또는 당신이 with 방법을 사용하는 경우 :

$users = User::with(['lastPost' => function($query) 
{ 
    $query->select('id', 'user_id', 'title', 'created_at'); 
})->get(); 

참고하면 필요

$users = User::with('lastPost')->get(); 

하면 하나의 관계 수준에서 쿼리를 제한 할 수 열을 제한하려면 user_idcreated_at 열은 0123에 필요하므로 쿼리의및 ORDER BY

+0

thx. 멋지게 보이고 아름답게 보입니다. 하지만 게시물의 제목과 ID 열만 있으면됩니다. 복잡한 쿼리를 작성하는 것에 대해 매우 혼란 스럽습니다. 지정된 열만 가져 오는 방법을 알려주시겠습니까? – Hasan

+0

예, 방금 추가 정보로 답변을 업데이트했습니다. –

+0

다시 한 번 고맙습니다. 그러나 결과는 완전히 반대하지 않습니다. $ user-> lastPost [ 'attributes'] [ 'title']을 사용하여 결과에 도달했습니다.이게 맞습니까? 나는 $ user-> lastPost-> title을 사용하여 접근 할 수 있다고 생각했다. – Hasan

0

이 작업을 수행하는 일반적인 SQL 방법은 다음과 같습니다

select p.* 
from posts p join 
    (select p.authorid, max(created_at) as maxdate 
     from posts p 
     group by p.authorid 
    ) psum 
    on p.authorid = psum.authorid and p.created_at = psum.maxdate 

이 더 중복이 없다가 있다고 가정합니다.

사용중인 데이터베이스에 따라이 쿼리를 작성할 수있는 다른 방법이 있습니다. 이 버전은 표준 SQL입니다.

관련 문제