sql >> Databáze >  >> RDS >> Mysql

laravel výmluvný seřadit podle vztahu

Dle mých znalostí chtivá zátěž with metoda spustit 2. dotaz. To je důvod, proč nemůžete dosáhnout toho, co chcete, pomocí horlivého načítání with metoda.

Myslím, že použijte join metoda v kombinaci s metodou vztahu je řešení. Následující řešení je plně otestováno a funguje dobře.

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

Poté můžete zavolat $user->sortedChannels('desc') zobrazí se seznam kanálů seřadit podle odpovědí created_at atribut.

Pro podmínky, jako jsou kanály (které mohou nebo nemusí mít odpovědi), stačí použít leftJoin metoda.

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

Upravit:

Pokud chcete přidat groupBy metodou na dotaz, musíte věnovat zvláštní pozornost vašemu orderBy doložka. Protože v Sql příroda, Group By klauzule spusťte jako první před Order By doložka. Podrobnosti o tomto problému najdete na tato otázka přetečení zásobníku .

Pokud tedy přidáte groupBy musíte použít orderByRaw a měl by být implementován jako následující.

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


  1. Jak vytvořit tabulku s omezením cizího klíče v SQL Server - SQL Server / TSQL výukový program, část 66

  2. Vysvětlení aliasu SQL

  3. Jak aktualizovat časové pásmo pro časová razítka (created_at a updated_at) spravované Laravel Eloquent?

  4. Je mysql_real_escape_string() nefunkční?