Consulta de unión elocuente de Laravel

5 minutos de lectura

Avatar de usuario de Howard
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.

  • 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

Avatar de usuario de Max Roa
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

Avatar de usuario de Jaymin Panchal
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

¿Ha sido útil esta solución?