В дополнение к ответу @ delmadord и вашим комментариям:
В настоящее время нет метода для создания подзапроса в FROM
предложении, поэтому вам нужно вручную использовать необработанный оператор, а затем, если необходимо, вы объедините все привязки:
$sub = Abc::where(..)->groupBy(..); // Eloquent Builder instance
$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
->mergeBindings($sub->getQuery()) // you need to get underlying Query Builder
->count();
Помните, что вам нужно объединить привязки в правильном порядке . Если у вас есть другие связанные предложения, вы должны поместить их после mergeBindings
:
$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
// ->where(..) wrong
->mergeBindings($sub->getQuery()) // you need to get underlying Query Builder
// ->where(..) correct
->count();
belongsToMany
вам нужно добавитьgetQuery()
дважды =>$sub->getQuery()->getQuery()
toSql
. Прочтите о PDO php.net/manual/en/book.pdo.php и посмотрите результат вашего$query->toSql()
$sub
запрос является Eloquent Builder , то вам все равно нужна->getQuery()
часть, иначе вы получите ошибку, поскольку этот метод намекает наQuery\Builder
класс.Добавлено Laravel v5.6.12 (2018-03-14)
fromSub()
иfromRaw()
методы для построитель запросов (# 23476) .Принятый ответ правильный, но его можно упростить до:
Приведенный выше фрагмент кода создает следующий SQL:
источник
Решение @JarekTkaczyk - это именно то, что я искал. Единственное, чего мне не хватает, так это того, как это сделать, когда вы используете
DB::table()
запросы. В данном случае я это делаю так:Особое внимание, как сделать
mergeBindings
без использованияgetQuery()
методаисточник
DB::raw()
В laravel 5.5 есть специальный метод для подзапросов, и вы можете использовать его следующим образом:
или
источник
Call to undefined method subSelect()
похожеsubSelect
, не существует.selectSub
. Я обновил свой ответ.Мне нравится делать что-то вроде этого:
Это не очень изящно, но все просто.
источник
Я не смог заставить ваш код выполнять желаемый запрос, AS - это псевдоним только для таблицы
abc
, а не для производной таблицы. Laravel Query Builder неявно поддерживает псевдонимы производных таблиц, для этого, скорее всего, понадобится DB :: raw.Самое простое решение, которое я мог придумать, почти идентично вашему, однако выдает запрос, который вы просили:
Созданный запрос
источник
Правильный способ, описанный в этом ответе: https://stackoverflow.com/a/52772444/2519714 Самый популярный ответ на данный момент не совсем правильный.
Таким образом, https://stackoverflow.com/a/24838367/2519714 неверен в некоторых случаях, например: sub select имеет где привязки, затем присоединение таблицы к дополнительному выбору, затем другие точки, добавленные ко всем запросам. Например, запрос:
select * from (select * from t1 where col1 = ?) join t2 on col1 = col2 and col3 = ? where t2.col4 = ?
чтобы сделать этот запрос, вы должны написать такой код:Во время выполнения этого запроса его метод
$query->getBindings()
будет возвращать привязки в неправильном порядке, как['val3', 'val1', 'val4']
в этом случае, вместо правильного['val1', 'val3', 'val4']
для необработанного sql, описанного выше.Еще раз правильный способ сделать это:
Также привязки будут автоматически и правильно объединены с новым запросом.
источник