2013-03-20 125 views
7

我是laravel(從CI轉換而來)的新手,而雄辯的ORM在某些時候仍然有點神祕!使用Eloquent對數據進行排序

這裏是我的問題:

我想用雄辯的從我的DB數據進行排序。

我有一個表帖子和一張桌子評論(後有很多的意見和評論屬於帖)

每個評論有一個時間戳(=> created_at字段),我想訂購事情如下:

(我們PROFIL頁,以便用戶在$> id是用戶(的ID很明顯))

我想從這個地方用戶做出的評論和帖子秩序每一個崗位所有那些由created_發佈的在評論領域

我真的很想充分使用雄辯,或至少流利,而我不知道正確的方式這樣做。

我希望我很清楚,並感謝您的時間!

回答

13

我剛剛遇到了同樣的問題,我正在開發一個項目。在我看來,我看到usort()uasort()作爲解決此問題的建議方法。 (Collection::sort()只是uasort()的包裝),但這並不滿足我,因爲爲什麼我會使用PHP進行排序,SQL何時應該使用ORDER BY子句對我進行排序?我最終實現它使用getXXXAttribute()方法是這樣的:

class Post extends Eloquent { 
    public function comments() 
    { 
     return $this->hasMany('Comment'); 
    } 

    public function getCommentsAttribute() 
    { 
     $comments = $this->comments()->getQuery()->orderBy('created_at', 'desc')->get(); 
     return $comments; 
    } 
    ... 
} 
+0

這樣排序的評論或帖子? – 2014-02-03 18:22:53

+0

它看起來像它整理評論... – 2014-02-08 22:28:31

+2

解決方案似乎已經過時。不知道他們什麼時候實現了這個功能,但是可以擴展與查詢功能的關係。所以在這種情況下,你可以寫 'return $ this-> hasMany('Comment') - > orderBy('created_at','desc')'。 [credt](http://stackoverflow.com/questions/18143061/laravel-orderby-on-a-relationship) – mwallisch 2015-04-07 00:43:36

1

像這樣的東西可能會有所幫助。

$content = Posts::with(array('comments' => function($query) { 
       $query->order_by('created_at', 'asc'); 
      })) 
      ->get(); 

或者,如果您的問題比較複雜:

How to sort by a field of the pivot table of a many-to-many relationship in Eloquent ORM

+0

感謝您的時間,但這不起作用:這是因爲查詢不會過濾帖子,而是評論。結果是,我得到了我所有的帖子,而且沒有整理出來。 拉拉維爾怎麼會這麼簡單的動作很難?我試過使用Fluent,但我不得不承認我討厭它......你有另一個想法嗎? – 2013-03-21 16:49:18

0

你所面臨的問題是,因爲你已經定義的關係僅僅是給你的是與相關的評論帖子和一個「Order By」的結果只是對評論進行排序,因爲評論是即將發佈的,所以你可以做的就是在評論模型中定義「評論」屬於「發佈」,然後找到哪些發表評論與之相關聯,然後使用usort()函數運行手動比較一個例子(我在Laravel 3中編寫代碼,但您可以將它重寫爲任何其他版本):

因此,假設您的評論表有一個外鍵,名爲postID它定義了與該帖子表和時間戳的帖子表是默認created_at和用戶表連接到評論表的外鍵用戶ID

$userid = $user->id; 
    $comments = Comments::where_userid($userid); 
    function commentsort($first, $second){ 
     if (getCommentPost($first) == getCommentPost($second)) { 
     return 0; 
     } 
    return (getCommentPost($first) < getCommentPost($second)) ? -1 : 1; 
    } 

    function getCommentPost($comment){ 
    return Post::where_postid($comment->postid)->first()->created_at; 
    } 

    usort($comments, "commentsort"); 

這應該有助於解決這個問題,在現實中,這不包含在Laravel中,因爲它是一個框架和函數這些執行特定功能的函數通常不包含在框架中,因爲使用範圍有限,據說你也可以在默認的DB類中包含這個函數,以便在項目中普遍使用這個函數。

2

我以前有同樣的問題,但它是一對一的關係。這post幫助了我。我結束了使用連接。我的代碼是這樣的:

$data = Posts::join('comments', 'comments.post_id', '=', 'posts.id') 
     ->order_by('comments.created_at') 
     ->get(array('comments.field1 as field1', 'posts.field2 as field2')); 
1

如果你在你的用戶類定義的關係,那麼你可以通過評論讓所有的帖子。它返回一個Collection,它提供了sortBy()和sortByDesc()函數。這兩個函數都會接受回調,您可以自己選擇排序方法。

$posts = $user->comments->post->sortByDesc(function($post) { 
    return $post->created_at; 
});