【问题标题】:Convert SQL to Laravel Query Builder With JOIN/SUB Queries使用 JOIN/SUB 查询将 SQL 转换为 Laravel 查询生成器
【发布时间】:2019-01-14 07:22:59
【问题描述】:
SELECT user_sessions.os, COUNT(*) FROM user_sessions
    JOIN (SELECT MIN(created_at) AS MinCreatedAt, user_id FROM user_sessions 
    GROUP BY user_id) AS us2
    ON (user_sessions.created_at = us2.MinCreatedAt 
        AND user_sessions.user_id = us2.user_id 
    GROUP BY user_sessions.os

这是我尝试在 Eloquent 中转换但失败的原始 SQL 查询。我的试用码是...

$q1 = self::select(DB::raw('MIN(created_at) as MinCreatedAt, user_id'))->groupBy('user_id');
$q2 = self::select(DB::raw('user_sessions.os, count(*)'));

$users = self::
select($q2)->joinSub($q1, 'us2', function ($join) {
$join->on('user_sessions.created_at = us2.MinCreatedAt AND user_sessions.user_id = us2.user_id ');
})->get();

错误

stripos() 期望参数 1 是给定的字符串对象

【问题讨论】:

  • 您已经在$q2 中进行了查询选择,因此您不需要在$user 中再次进行选择,这将是错误,因为select() 除了字符串,但$q2 是对象

标签: laravel eloquent laravel-query-builder


【解决方案1】:

试试这个。

$joinQuery = "(".DB::table('user_sessions')
    ->selectRaw('MIN(created_at) AS MinCreatedAt, user_id')
    ->groupBy('user_id')->toSql().") as us2" ;


$users = DB::table('user_sessions')
        ->selectRaw("user_sessions.os, COUNT(*)")
        ->join(DB::raw($joinQuery), function ($join) {
            $join->on('user_sessions.created_at', '=', 'us2.MinCreatedAt')->on('user_sessions.user_id', '=', 'us2.user_id');
        })
        ->groupBy('user_sessions.os');

更新

$q1 = self::select(DB::raw('MIN(created_at) as MinCreatedAt, user_id'))->groupBy('user_id');
$q2 = self::select(DB::raw('user_sessions.os, count(*)'));

$users = $q2->joinSub($q1, 'us2', function ($join) {
$join->on('user_sessions.created_at = us2.MinCreatedAt AND user_sessions.user_id = us2.user_id ');
})->groupBy('user_sessions.os')->get();

【讨论】:

  • 这不是一个合适的方法,它对我不起作用。
  • @AhtishamShahid 刚刚更新,你能再检查一下吗
猜你喜欢
  • 2019-10-14
  • 2021-08-07
  • 2015-12-13
  • 2017-06-01
  • 2019-09-08
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多