sql >> Database teknologi >  >> RDS >> Mysql

laravel veltalende sortering efter forhold

Efter min viden, ivrig belastning with metode køre 2. forespørgsel. Derfor kan du ikke opnå det, du ønsker, med ivrig loading with metode.

Jeg tror, ​​du bruger join metode i kombination med relationsmetode er løsningen. Følgende løsning er fuldt testet og fungerer godt.

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

Så kan du kalde $user->sortedChannels('desc') for at få listen over kanaler sorter efter svar created_at attribut.

Til tilstand som kanaler (som muligvis har svar eller ikke), brug bare leftJoin metode.

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

Rediger:

Hvis du vil tilføje groupBy metode til forespørgslen, skal du være særlig opmærksom på din orderBy klausul. Fordi i Sql natur, Group By klausul køres først før Order By klausul. Se detaljer om dette problem på dette stackoverflow-spørgsmål .

Så hvis du tilføjer groupBy metode, skal du bruge orderByRaw metode og bør implementeres som følgende.

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


  1. MariaDB DEFAULT() Forklaret

  2. Henter data til histogramplot

  3. mysqldump-tabel uden at dumpe den primære nøgle

  4. PostgreSQL Opret database