Mysql
 sql >> Baza danych >  >> RDS >> Mysql

laravel elokwentny sortuj według związku

Zgodnie z moją wiedzą chętne ładowanie with metoda uruchom drugie zapytanie. Dlatego nie możesz osiągnąć tego, czego chcesz, przy ładowaniu z chęcią with metoda.

Myślę, że użyj join metoda w połączeniu z metodą relacji jest rozwiązaniem. Poniższe rozwiązanie jest w pełni przetestowane i działa dobrze.

// In User Model
public function channels()
{
    return $this->belongsToMany('App\Channel', 'channel_user')
        ->withPivot('is_approved');
}

public function sortedChannels($orderBy)
{
    return $this->channels()
            ->join('replies', 'replies.channel_id', '=', 'channel.id')
            ->orderBy('replies.created_at', $orderBy)
            ->get();
}

Następnie możesz wywołać $user->sortedChannels('desc') aby uzyskać listę kanałów zamów według odpowiedzi created_at atrybut.

Dla warunków takich jak kanały (które mogą mieć odpowiedzi lub nie), po prostu użyj leftJoin metoda.

public function sortedChannels($orderBy)
    {
        return $this->channels()
                ->leftJoin('replies', 'channel.id', '=', 'replies.channel_id')
                ->orderBy('replies.created_at', $orderBy)
                ->get();
    }

Edytuj:

Jeśli chcesz dodać groupBy metody do zapytania, należy zwrócić szczególną uwagę na swoje orderBy klauzula. Ponieważ w Sql natura, Group By klauzula uruchamiana jako pierwsza przed Order By klauzula. Zobacz szczegóły tego problemu na to pytanie o przepełnienie stosu .

Więc jeśli dodasz groupBy metody, musisz użyć orderByRaw metoda i powinna być zaimplementowana w następujący sposób.

return $this->channels()
                ->leftJoin('replies', 'channels.id', '=', 'replies.channel_id')
                ->groupBy(['channels.id'])
                ->orderByRaw('max(replies.created_at) desc')
                ->get();


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oszczędzasz HABTM z dodatkowymi polami?

  2. Dynamiczny zakres między wierszami podczas pobierania rekordów z bazy danych

  3. dodaj tymczasową kolumnę z wartością

  4. MySQL Order według liczby, pustych ciągów (lub zer) Ostatnie

  5. mysql rozróżnia wielkość liter w utf8_general_ci