Конвертировать SQL в Laravel Query Builder с помощью запросов JOIN / SUB - PullRequest
0 голосов
/ 14 января 2019
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

Это необработанный запрос SQL, который я пытался преобразовать в Eloquent, но не смог. Мой пробный код ...

$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();

Error

stripos () ожидает, что параметр 1 будет строковым объектом, заданным

1 Ответ

0 голосов
/ 14 января 2019

попробуйте это.

$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();
...