Howard
Entonces tengo la siguiente consulta:
$a = Model::where('code', '=', $code)
->where('col_a', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
$b = Model::where('code', '=', $code)
->where('col_b', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
$a->union($b)->get();
No se realiza ninguna clasificación cuando ‘orderBy ()’ primero y luego unión.
Cuando consulto ‘$a’ o ‘$b’ individualmente, ‘orderBy()’ funciona bien.
Cuando lo hago de la siguiente manera, ‘orderBy()’ sucede como un todo.
$a->union($b)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
->get();
¿Cómo puedo hacer que el ‘orderBy ()’ se aplique a cada uno individualmente y luego vuelva a unir los resultados? Parece que debería funcionar.
EDITAR: si alguien puede proporcionar una forma de hacer esto, incluso si es MySQL normal, elegiré la suya como respuesta, ya que creo que puede haber un error con Eloquent.
max roa
Prueba lo siguiente:
$a = Model::where('code', '=', $code)
->where('col_a', '=' , 1);
$b = Model::where('code', '=', $code)->where('col_b', '=' , 1)
->union($a)
->get();
$result = $b;
-
Pero en caso de que ambas tablas tengan números diferentes de columnas, da error. ¿Hay alguna manera de que pueda usar UNION en elocuente con tablas de columnas de diferencias?
– Sunil pachlangia
20 de diciembre de 2019 a las 15:29
-
@Sunil Para mí, eso es imposible de unir en diferentes números de columnas. a menos que agregue aliados seleccionados con valor nulo.
– AbingPj
20 de agosto de 2020 a las 9:46
-
Cada instrucción SELECT dentro de UNION debe tener el mismo número de columnas. Las columnas también deben tener tipos de datos similares. Las columnas de cada instrucción SELECT también deben estar en el mismo orden.
– fahad jeque
18 de febrero de 2021 a las 18:45
jaymin panchal
Solo trata de aplicar orderBy()
después union()
Prueba esto
$a->union($b)->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();
EDITAR
Investigué, encontré y preparé una consulta elocuente, solo intente esto
$modelA = Model::where('code', '=', $code)
->where('col_a', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
$modelB = Model::where('code', '=', $code)
->where('col_b', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))
$a = DB::table(DB::raw("({$modelA->toSql()}) as a"))
->mergeBindings($modelA->getQuery())
->selectRaw("a.*");
$b = DB::table(DB::raw("({$modelB->toSql()}) as b"))
->mergeBindings($modelB->getQuery())
->selectRaw("b.*");
$a->union($b)->get();
-
No lo quiero ordenado como un todo. Quiero que las consultas individuales se ordenen dentro de sí mismas.
– Howard
20 de enero de 2017 a las 5:12
-
¿Puedes publicar el resultado sin unión y con unión para saber más sobre los problemas?
– Jaymin Panchal
20 de enero de 2017 a las 5:21
-
Sería difícil porque simplifiqué la consulta para la pregunta. Básicamente, no ocurre ninguna clasificación cuando ordeno por () primero y luego unión. Cuando los hago individualmente, orderBy () funciona bien. Cuando lo hago en función de la respuesta que publicaste, orderBy() sucede como un todo.
– Howard
20 de enero de 2017 a las 5:29
-
Creo que esto puede ser un error de Laravel. Publiqué el error en github. Esperemos que se resuelva pronto.
– Howard
20 de enero de 2017 a las 5:42
-
@PrafullaKumarSahu Comprobando ahora.
– Howard
20 de enero de 2017 a las 5:48
El “unir” La función en la colección Laravel podría ayudarlo.
La gran diferencia es que cierro la consulta con ->get() por adelantado, y uso merge() en lugar de union()
$a = Model::where('code', '=', $code)
->where('col_a', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();
$b = Model::where('code', '=', $code)
->where('col_b', '=' , 1)
->orderBy(DB::raw('FIELD(layout, "normal", "split", "flip", "double-faced", "") ASC, layout'))->get();
$result = $a->merge($b);
Nota: no tengo sus datos, así que no puedo probar que funcione, pero al menos funciona con mis datos, así que vale la pena intentarlo.
-
Agregué ->get(); hasta el final de tus ejemplos $a y $b. La solución que proporcionó funciona, pero requiere acceder a la base de datos para cada uno, que es lo que estoy tratando de evitar porque necesito múltiples uniones, pero esta es actualmente la mejor respuesta.
– Howard
20 de enero de 2017 a las 23:14
-
No funciona, cuando es necesario paginar el resultado combinado con el orden de clasificación correcto
– Alexei Tsinya
25 oct 2018 a las 15:53
-
Hice esto para obtener los resultados adecuados con el resultado de la tabla de datos $a->union($b)->get(); [Add get(); after union is applied]
–Disha Goyal
28 oct 2022 a las 10:16
Por qué “no funciona”. ¿Cuál es el error o la salida?
– Gayán
20 de enero de 2017 a las 5:06
No hay error. Simplemente no parece aplicar el orderBy sorting.
– Howard
20 de enero de 2017 a las 5:07
No es una cosa de Eloquent, es una cosa de MySQL. Consulte el “Seguimiento” en la respuesta aceptada aquí: stackoverflow.com/questions/24683766/…. Básicamente: ORDER BY no se tendrá en cuenta en UNIONs, y puede incluso depender de la versión de MySQL.
– zmippi
12 de abril de 2017 a las 9:12