Además de la respuesta de @ delmadord y sus comentarios:
Actualmente no hay un método para crear subconsultas en la FROMclá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();
belongsToManysubselecció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()$subconsulta 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\Builderclase.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
mergeBindingssin 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()parecesubSelectque 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