2014-10-15 4 views
5

나는 개의 게시물 테이블과 개의 댓글 테이블에 있으며, 댓글은 게시물에 속하며 게시 및 댓글 모델에는 관계 설정이 있습니다. 나는 종류의이 같은 각 게시물의 의견의 숫자로 게시 않았다Laravel sortBy 페이지 번호

내가이 정렬 된 게시물 페이지를 매기는 방법을 궁금해 무엇
 $posts = Post::with('comments')->get()->sortBy(function($post) { 
      return $post->comments->count(); 
     }); 

?

 $posts = Post::with('comments')->get()->sortBy(function($post) { 
      return $post->comments->count(); 
     })->paginate(20); 

작동하지 않으며 페이지 매김이 정의되지 않은 오류라고 알려줍니다. 당신이 그것을 웅변을 사용하지만이 조인을 사용할 수 있습니다 할 수 있다면

답변

4

나도 몰라 :

$posts = Post::leftJoin('comments','posts.id','=','comments.post_id')-> 
       selectRaw('posts.*, count(comments.post_id) AS `count`')-> 
       groupBy('posts.id')-> 
       orderBy('count','DESC')-> 
       paginate(20); 

는이 경우 모든 레코드를 데이터베이스에서 가져옵니다 및 매기기에서 만 표시 것으로 보인다 그러나 , 많은 레코드가 있다면 그것은 자원 낭비입니다. 당신이 수동 매김해야 할 것 같다 skiptake을 사용

$posts = Post::leftJoin('comments','posts.id','=','comments.post_id')-> 
       selectRaw('posts.*, count(comments.post_id) AS `count`')-> 
       groupBy('posts.id')-> 
       orderBy('count','DESC')-> 
       skip(0)->take(20)->get(); 

을하지만 난하지 웅변 전문가는 아니지만 당신이 기다릴 수 어쩌면 누군가가 더 나은 대답을 줄 것이다, 그래서 어쩌면 더 나은 솔루션은 당신의 목표를 달성하기 위해있다 .

+0

Thansk,이 솔루션은하지 않습니다 데이터베이스에서 모든 레코드를 가져 와서 정렬하면 매우 초기 레코드에서 20 레코드 만 가져옵니다. – dulan

+0

@dulan, 두 번째 코드에 대해 이야기하고 있다면 그렇습니다. 첫 번째 코드에서 모든 레코드는 데이터베이스에서 가져와 일부만 표시하므로 두 번째 솔루션을 선택해야합니다 –

+0

skip()을 사용하여 주셔서 감사합니다 –

0

연결 호출에서 get()을 제거하고 얻은 결과를 확인하면 페이지 매기기가 get() 호출을 대체해야합니다.

+0

작동하지 않습니다. 'sortBy'는 결과 셋을 위해서 사용됩니다. 그래서 paginate를 사용하면 정렬은 모든 레코드가 아닌 처음 20 행에 대해서만 이루어집니다. 그것이 차이점입니다. 먼저 정렬 다음 반대쪽에 –

+0

나는 get()을 제거하는 것이 좋습니다, paginate()로 교체하지 말고, paginate가 기능적으로 바꾸는 것이 좋습니다. – cdarken

1

이것은 분명하지만 Eloquent는 여기서 결과 집합을 반환하지 않지만 컬렉션을 반환합니다.

당신이 (Builder::getConnection::select를 호출하는 Builder::runSelect를 호출하는 Builder::getFresh를 호출) 소스 파고 경우, 당신은 의도는 단순히 다음 sortBy을 가지고 모음 (에 배치되는 결과를 반환하는 것입니다 있다고 찾을 수 있습니다 방법). 당신은 모든 항목을로드하지 않고 페이지 매김을 갖고 싶어

/** 
* Run a select statement against the database. 
* 
* @param string $query 
* @param array $bindings 
* @param bool $useReadPdo 
* @return array 
*/ 
public function select($query, $bindings = array(), $useReadPdo = true) 
{ 
    return $this->run($query, $bindings, function($me, $query, $bindings) use ($useReadPdo) 
    {  
    if ($me->pretending()) return array(); 

    // For select statements, we'll simply execute the query and return an array 
    // of the database result set. Each element in the array will be a single 
    // row from the database table, and will either be an array or objects. 
    $statement = $this->getPdoForSelect($useReadPdo)->prepare($query); 

    $statement->execute($me->prepareBindings($bindings)); 

    //** this is a very basic form of fetching, it is limited to the PDO consts. 
    return $statement->fetchAll($me->getFetchMode()); 
    }); 
} 

, 다음 (아래 복제) 마르신의 솔루션 @ 사용할 필요가 : 그래서 그냥 명확하게하기 위해,

$posts = Post::leftJoin('comments','posts.id','=','comments.post_id')-> 
      selectRaw('posts.*, count(comments.post_id) AS `count`')-> 
      groupBy('posts.id')-> 
      orderBy('count','DESC')-> 
      skip(0)->take(20)->get();