Además de la respuesta de @ delmadord y sus comentarios:
Actualmente no hay un método para crear subconsultas en la FROM
cláusula, por lo que debe usar manualmente la declaración sin procesar, luego, si es necesario, fusionará todos los enlaces:
$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();
Tenga en cuenta que necesita fusionar enlaces en el orden correcto . Si tiene otras cláusulas vinculadas, debe ponerlas después de 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
subselección, debe agregargetQuery()
dos veces =>$sub->getQuery()->getQuery()
toSql
. Lea acerca de PDO php.net/manual/en/book.pdo.php y vea el resultado de su$query->toSql()
$sub
consulta es un Eloquent Builder , entonces todavía necesita la->getQuery()
parte, de lo contrario obtendrá un error, ya que este método está escrito en contra de laQuery\Builder
clase.Se agregó Laravel v5.6.12 (2018-03-14)
fromSub()
yfromRaw()
métodos para el generador de consultas (# 23476) .La respuesta aceptada es correcta pero se puede simplificar en:
El fragmento anterior produce el siguiente SQL:
fuente
La solución de @JarekTkaczyk es exactamente lo que estaba buscando. Lo único que echo de menos es cómo hacerlo cuando se utilizan
DB::table()
consultas. En este caso, así es como lo hago:Atención especial a cómo hacer el
mergeBindings
sin usar elgetQuery()
método.fuente
DB::raw()
hizo el trabajo por míDesde laravel 5.5 hay un método dedicado para subconsultas y puede usarlo así:
o
fuente
Call to undefined method subSelect()
parecesubSelect
que no existe.selectSub
. Actualicé mi respuesta ahora.Me gusta hacer algo como esto:
No es muy elegante, pero es simple.
fuente
No pude crear su código para hacer la consulta deseada, el AS es un alias solo para la tabla
abc
, no para la tabla derivada. Laravel Query Builder no admite implícitamente los alias de tablas derivadas, lo más probable es que DB :: raw sea necesario para esto.La solución más directa que se me ocurrió es casi idéntica a la suya, sin embargo, genera la consulta que solicitó:
La consulta producida es
fuente
Forma correcta descrita en esta respuesta: https://stackoverflow.com/a/52772444/2519714 La respuesta más popular en el momento actual no es totalmente correcta.
De esta manera, https://stackoverflow.com/a/24838367/2519714 no es correcto en algunos casos, como: la selección secundaria tiene enlaces donde, luego se une la tabla a la selección secundaria, luego se agregan otros sitios a todas las consultas. Por ejemplo consulta:
select * from (select * from t1 where col1 = ?) join t2 on col1 = col2 and col3 = ? where t2.col4 = ?
Para realizar esta consulta, escribirás un código como:Durante la ejecución de esta consulta, su método
$query->getBindings()
devolverá enlaces en orden incorrecto, como['val3', 'val1', 'val4']
en este caso, correctos['val1', 'val3', 'val4']
para el sql sin formato descrito anteriormente.Una forma más correcta de hacer esto:
Además, los enlaces se fusionarán automática y correctamente con la nueva consulta.
fuente