2014-10-15 14 views
5

sayfalarını düzenliyor ve ben mesaj ve Yorum modelinde ilişki kurulum var. Bir çeşit böyle her yayındaki yorum sayısına göre nakleder ki:laravel SortBy ben</em> masa ve <em>comments</em> tablo, yorum sonrasına ait bir <em>mesajları var

Ben bu sıralama mesajları paginate nasıl olduğunu merak nedir
 $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); 

çalışmak ve bana paginate tanımlanmamış bir yöntemdir diyor hata veriyor etmez. Eğer anlamlı kullanarak ancak bunun için katılmak kullanabilirsiniz yapabileceğini

cevap

4

Bilmiyorum:

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

durumda tüm kayıtlar veritabanından alınır ve paginator sadece bu görüntülenen gibi görünüyor Ancak Çok kayıtlarınız varsa, kaynak israfı demektir. Size bunun için manuel sayfalandırma yapmak gerekir görünüyor: skip ve take kullanılarak

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

ama ben, Etkili uzman değilim ve siz bekleyebilir ve belki birisi daha iyi bir cevap verecektir belki daha iyi bir çözüm için hedefe ulaşmak için var .

+0

thansk, bu çözüm olmaz tüm kayıtları veritabanından al ve sonra sırala, çok başlangıçta sadece 20 kayıt alır? – dulan

+0

@dulan, evet 2. kod hakkında konuşuyorsak. 1. kodda tüm kayıtlar veritabanından alınacak ve bunlardan sadece birkaçı görüntülenecektir, bu yüzden skip() –

+0

2. çözümünü seçmeniz gerekiyor, çünkü teşekkürler skip() –

0

Zincirli aramalarda sadece get()'u kaldırın ve ne aldığınızı görün, paginate get() çağrısının yerini almalıdır.

+0

Çalışmıyor. 'sortBy' sonuç kümesi için kullanılır, bu nedenle sayfalandırma kullanıldığında bu sıralama sadece ilk 20 satırda yapılır ve tüm kayıtlar için yapılmaz. Aradaki fark bu. Önce sıralamak daha sonra –

+0

karşı sayfalandırma paginate(), paginate yerine işlevsel olarak konuşma yerini almak için get() kaldırmak için onu tavsiye. – cdarken

1

Bu sesler açık, ancak Eloquent burada bir sonuç kümesi döndürmeyecek, ancak bir koleksiyona dönecektir.

sen (Builder::getConnection::select çağırır; Builder::runSelect çağırır; Builder::getFresh çağırır) kaynağına kazmak, bunu niyeti basitçe sonra SortBy olan bir koleksiyona (yerleştirilir sonuçları, geri dönmek mi olduğunu göreceksiniz yöntem). Her öğeyi yüklemeden pagination olmasını istiyorsanız

/** 
* 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()); 
    }); 
} 

, o zaman (aşağıda çoğaltılamaz) Marcin çözümüyle @ kullanmanız gerekir: bu kadar açık konuşmak gerekirse,

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