Как получить результаты с помощью подзапросов с помощью laravel eloquent - PullRequest
0 голосов
/ 12 ноября 2018

Я пытался получить результаты, используя подзапросы. Мне нужно выполнить два подзапроса, но до сих пор я не смог получить результаты.

Следующий запрос дает желаемый результат:

SELECT x.responsible_cook_id, x.d
FROM (
    SELECT 
        responsible_cook_id, 
        count(*) d
    FROM orders 
    GROUP BY responsible_cook_id
    ORDER BY count(*)  ASC
) as x
WHERE x.responsible_cook_id IN (
    SELECT ID
    FROM users
    WHERE type = "cook" AND shift_active = 1
)
ORDER BY x.d;

До сих пор я пытался использовать этот подход для выполнения того же запроса через Eloquent:

$fSubquery = Order::select('responsible_cook_id, count(*) as d')->groupBy('responsible_cook_id')->orderByRaw('count(*) ASC');
        $sSubquery = User::where('type', 'cook')->where('shift_active', 1);

        $users = DB::table(DB::raw("({$fSubquery->toSql()}) as x"))
            ->mergeBindings($fSubquery->getQuery())
            ->whereRaw("x.responsible_cook_id IN {$sSubquery->toSql()}")
            ->mergeBindings($sSubquery->getQuery())
            ->select('x.responsible_cook_id, x.d')
            ->orderByRaw('ORDER BY x.d')->get();

Этот последний запрос не дал результатов. Есть ли способ выполнить эти подзапросы и получить результаты?

1 Ответ

0 голосов
/ 14 ноября 2018

Ну, я не мог решить вопрос, описанный выше, но это остается частью изучения того, что иногда, когда вы отпускаете его, это просто срабатывает, а иногда даже помогает вам.

Вместо того, чтобы делать 3 запроса (2 подзапроса + внешний запрос), я смог сократить все это до одного запроса, используя Eloquent от Laravel

Вот что случилось

 // Get all cookers that have an active shift
 $cookersWorking = User::where('type', 'cook')
   ->where('shift_active', 1)
   ->select('id')
   ->get();

После получения всех плит, которые имеют активную смену, я смог получить все плиты, у которых наименьшее количество блюд для приготовления:

// We will get the cooker that has the least orders to prepare
$cookerWithLessDishes = Order::select('responsible_cook_id', DB::raw('count(*) as d'))
    ->whereNull('end') // added this but is not in the original question
    ->whereIn('responsible_cook_id', $cookersWorking->pluck('id'))
    ->groupBy('responsible_cook_id')
    ->orderByRaw('count(*) ASC')
    ->first();

Я думаю, что смог сократить это до двух запросов. Если я ошибаюсь, поправьте меня.

Счастливое кодирование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...