Laravel - relacje a sortowanie

0

Cześć, podczas pisania strony napotkałem pewien problem, czy jest możliwość sortowania w relacjach?

Powiedzmy mam tabele UsersOnline z relacją hasOne do Users, pobieram wszystkich użytkowników online w ten sposób:
$list = UsersOnline::with('user')->get();

no i chciałbym to posortować po wartościach z Users czyli tej relacji, innym rozwiązaniem może byłoby zmienić te zapytanie na RAW? z left join itd ale wtedy nie miałbym możliwości z korzystania funkcji modelu (np. user->getSlug() etc)

2

Możesz użyć notacji kropkowej z Laravel i zrobić coś takiego:

$list = UsersOnline::with('user')
    ->orderBy('user.id')
    ->get();
0

@jurek1980: niestety ale wyrzuca takie zapytanie select * from `users_online` order by `users`.`online_time` asc, udało mi się uzyskać efekt stosując coś takiego:

$list = $list->sortByDesc(function($row) use ($sortKey) {
    return $row->user->$sortKey;
})

co myślisz?

Edit: tylko mam problem z sortowaniem alfabetycznym a-z, nie działa, jedynie na liczby..

0

Ale ten online_time to w tabeli users_online tak? No bo tak po co Ci odrębny model?
Pokaż jak byś to zapisał w SQL i jakie masz kolumny w tabeli.

0

Tak, ten online_time (nazwa kolumny tylko przykładowa) znajduje się w tabeli Users czyli tej do której UsersOnline ma relacje i po tym właśnie chce sortować.
W SQL zrobiłbym to na zasadzie

SELECT * FROM `users_online` `uo` LEFT JOIN `users` `u` ON `u`.`id` = `uo`.`user_id` ORDER BY `u`.`online_time` DESC

Edit. ewentualnei zerknij post wyżej, edytowałem post z nowym sortowaniem

0

Jedyną rozsądną opcją jest sortowanie na kolekcji którą dostaniesz po wywołaniu get(), Twój pomysł, który podałeś jest strasznie niewydajny.
Drugą opcją jest zamiana kolejności i zrobienie Users::whereHas(...)->...

0

@mr_jaro: czyli to nie wykonuje się na kolekcji?

UsersOnline::with('user')->get()->sortByDesc(function($row) use ($sortKey) {
     return $row->user->$sortKey;
});
1

@storm.: to tak, nie pokazałeś całego kodu wyglądało jak wersja sprzed geta. więc to co pokazujesz teraz jest ok.

0

@mr_jaro: a wiesz może jak zrobić te sortowanie aby działało również na litery? przykładowo jeśli chciałbym posortować ludzi po imieniu, bo obecnie działa jedynie na liczby

2
UsersOnline::with('user')->get()->sort(function ($a, $b) {
                return $a->user->name > $b->user->name;
            });
0

Dzięki!

0

Relacja powinna być raczej belongsTo, a nie hasOne w tym przypadku.
Możesz sobie zrobić leftJoina jednej i drugiej tabeli i posortować od razu w zapytaniu, według dowolnej kolumny.

1 użytkowników online, w tym zalogowanych: 0, gości: 1