1. ホーム
  2. laravel

[解決済み] Laravel Fluent Query Builder サブクエリによる結合

2023-04-14 22:04:13

質問

何時間も研究した後、まだDB::selectを使っていますが、この質問をしなければなりません。なぜなら、私は自分のコンピュータを捨てようとしているからです;)。

私はユーザーの最後の入力を取得したいです(タイムスタンプに基づく)。私は生のSQLでこれを行うことができます。

SELECT  c.*, p.*
FROM    users c INNER JOIN
(
  SELECT  user_id,
          MAX(created_at) MaxDate
  FROM    `catch-text`
  GROUP BY user_id
 ) MaxDates ON c.id = MaxDates.user_id INNER JOIN
    `catch-text` p ON   MaxDates.user_id = p.user_id
     AND MaxDates.MaxDate = p.created_at

私はこのクエリを他の投稿から入手しました ここで を参照してください。

Laravelのfluent query builderでこれを行うためにすべてを試しましたが、成功しませんでした。

マニュアルにはできると書いてあるのですが。

DB::table('users')
    ->join('contacts', function($join)
    {
        $join->on('users.id', '=', 'contacts.user_id')->orOn(...);
    })
    ->get();

しかし、それは私がそこにサブクエリを使用することができるか分からないので、あまり助けになりませんか? 誰か私の一日を照らすことができますか?

どのように解決するには?

同じ問題を検索して、絶望的にここに到着したすべてのあなたのために、OK。私はあなたが私より速くこれを見つけることを望みます;O.

これが解決方法です。JoostKはgithubで、"joinの最初の引数は結合するテーブル(またはデータ)であると教えてくれました。そして彼は正しかった。

以下はそのコードです。テーブルも名前も違いますが、イメージはつかめると思います。これは

DB::table('users')
        ->select('first_name', 'TotalCatches.*')

        ->join(DB::raw('(SELECT user_id, COUNT(user_id) TotalCatch,
               DATEDIFF(NOW(), MIN(created_at)) Days,
               COUNT(user_id)/DATEDIFF(NOW(), MIN(created_at))
               CatchesPerDay FROM `catch-text` GROUP BY user_id)
               TotalCatches'), 
        function($join)
        {
           $join->on('users.id', '=', 'TotalCatches.user_id');
        })
        ->orderBy('TotalCatches.CatchesPerDay', 'DESC')
        ->get();