sql >> データベース >  >> RDS >> Mysql

Laravelの雄弁な関係による並べ替え

    私の知る限り、熱心な負荷 with メソッドは2番目のクエリを実行します。そのため、積極的な読み込みでは目的を達成できません。 with メソッド。

    joinを使うと思います 関係方法と組み合わせた方法 解決策です。次のソリューションは完全にテストされており、正常に機能します。

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

    次に、$user->sortedChannels('desc')を呼び出すことができます チャネルのリストを取得するには 返信による注文created_at 属性。

    チャネルのような状態の場合 (返信がある場合とない場合があります)、leftJoinを使用してください メソッド。

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

    編集:

    groupByを追加する場合 クエリのメソッドでは、orderByに特別な注意を払う必要があります 句。 SQL 性質、Group By 句はOrder Byの前に最初に実行されます 句。この問題の詳細については、このstackoverflowの質問

    したがって、groupByを追加すると メソッドでは、orderByRawを使用する必要があります メソッドであり、次のように実装する必要があります。

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


    1. 外部キー制約のためにオブジェクトを削除できません

    2. データレプリケーションの目的は何ですか?

    3. MySQLデフォルトデータベース

    4. mysqli_connect():(HY000 / 2003):「ドメイン名」でM​​ySQLサーバーに接続できません(111)