2013-03-20 28 views
7

Jestem nowicjuszem w laravel (zmiana z CI) i elokwentna ORM wciąż jest w pewnym sensie tajemnicą!Sortowanie danych za pomocą Eloquent

Oto mój problem:

Chciałbym sortować dane z mojego db przy użyciu wymowny.

Mam tabeli posty i stół komentarze (post wiele uwagi i komentarz należy do postów)

Każdy komentarz został znacznik czasu (=> pola created_at) i chciałbym zamówić rzeczy następujące:

(jesteśmy na stronie pROFIL tak $ user-> id jest identyfikatorem użytkownika (oczywiście))

chcę każdy post ze stanowisk, gdzie użytkownik wykonanych komentarz i porządku wszystkie te posty przez created_ w polu komentarza

Naprawdę chcę używać Eumquent w pełni, a przynajmniej Fluent, i nie znam właściwego sposobu, aby to zrobić.

Mam nadzieję, że jestem jasny i dziękuję za poświęcony czas!

Odpowiedz

13

Po prostu wpadłem na ten sam problem w projekcie, który rozwijam.Gdziekolwiek spojrzałam, zobaczyłem usort() lub uasort() jako sugerowany sposób rozwiązania tego problemu. (Collection::sort() jest tylko opakowaniem dla uasort()), ale to nie zadowoliło mnie, ponieważ dlaczego miałbym używać PHP do sortowania, gdy SQL powinien to zrobić dla mnie z klauzulą ​​ORDER BY? Skończyło się na wdrożenie go w ten sposób przy użyciu metody 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

Czy sortuje komentarze lub posty? –

+0

wygląda na to, że sortuje komentarze ... –

+2

rozwiązanie wydaje się być nieaktualne. Nie wiem, kiedy faktycznie to zaimplementowano, ale możesz rozszerzyć relację o funkcje zapytań. W takim przypadku możesz po prostu napisać: 'return $ this-> hasMany ('Comment') -> orderBy ('created_at', 'desc')'. [credt] (http://stackoverflow.com/questions/18143061/laravel-orderby-on-a-relationship) – mwallisch

1

Coś takiego może pomóc.

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

Albo czy problem jest bardziej złożony:

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

+0

Dziękujemy za poświęcony czas, ale to nie działa: dzieje się tak, ponieważ zapytanie nie filtruje postów, ale komentarz. w rezultacie otrzymuję wszystkie moje posty i nie jest to uporządkowane. Dlaczego takie proste działanie jest trudne w laravel? Próbowałem używać Fluent, ale muszę przyznać, że go nienawidzę ... Masz inny pomysł? –

0

Kwestia stoją dlatego, że związek, który już jest zdefiniowany tylko co daje komentarzach, które są związane z posty i "Sortuj według" na tym wyniku będą tylko sortować komentarze, ponieważ komentarze są tym, co wychodzi, więc możesz także zdefiniować, że "Komentarze" należą do "Opublikuj" w modelu Komentarze, a następnie znajdź, które Opublikuj komentarz jest powiązany, a następnie użyj funkcji usort(), aby uruchomić ręczne porównanie MPle byłyby (piszę kod w laravel 3, ale można ponownie zapisać go do innych wersji):

Zakładając więc, że tabela Komentarze posiada klucz obcy o nazwie postID który określa relację z tabela Wiadomości i datownik w tabeli postach jest domyślnym created_at i tabela użytkowników jest podłączony do stołu Komentarze z klucza obcego identyfikatora,

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

to powinno pomóc rozwiązać ten problem, w rzeczywistości nie jest zawarty w Laravel, ponieważ jest to framework i działa jak te, które wykonują określone funkcje, nie są zwykle uwzględnione w strukturze, ponieważ istnieje ograniczony zakres użycia, co oznacza, że ​​można również włączyć tę funkcję do domyślnej klasy DB, aby korzystać z tej funkcji powszechnie w projekcie.

2

Miałem ten sam problem wcześniej, ale był to związek jeden do jednego. Ten post pomógł mi. Skończyło się na użyciu sprzężenia. Mój kod wyglądał następująco:

$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

Jeśli masz relacje zdefiniowane w klasie użytkownika będzie można uzyskać wszystkie posty, poprzez komentarze. Zwraca kolekcję, która udostępnia funkcje sortBy() i sortByDesc(). Obie te funkcje przyjmą wywołanie zwrotne, w którym możesz samodzielnie wybrać metodę sortowania.

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