Usar otros valores de columna para la actualización de Eloquent

2 minutos de lectura

avatar de usuario de lesssugar
menos azucar

me gustaria realizar un UPDATE usando Eloquent, eso establecerá column_c valor usando valores de column_a y column_b de la misma mesa. Básicamente, algo como esto:

User::where('id', '>', 0)
        ->update(['column_c' => $this->column_a + $this->column_b]);

dónde $this->column_a y $this->column_b sería los valores reales de la fila actual.

MySQL equivalente:

UPDATE `user` WHERE id > 0 SET column_c = column_a + column_b;

Nota: El código anterior es solo un ejemplo para mostrar la idea. Es no la implementación real (que sería crear una redundancia de base de datos).

¿Cómo realizo dicha actualización en Laravel 5.1? Realmente me gustaría evitar un foreach.

Tal vez DB::raw poder ayudar. Esto le permitirá utilizar cualquier consulta sql estándar para combinar sus datos:

User::where('id', '>', 1)
    ->update(['column_c' => DB::raw( CONCAT(column_a, '-', column_b) )]);

  • Por supuesto que lo sé DB::raw(), es útil, pero creo que es una “solución alternativa” para consultas avanzadas, que son difíciles de construir con Eloquent o Query Builder. Es bastante decepcionante que algo que se hace tan fácilmente en MySQL (como en mi publicación) no esté disponible en Laravel. Gracias de todos modos 🙂

    – menos azucar

    29 de junio de 2015 a las 14:51

  • Pero supongo que con Eloquent solo existe la forma de consultar los datos primero. Como dijiste DB::raw() es algo para consultas avanzadas y lo llamaría ya avanzado ya que no hay funciones como concat en laravel.

    – Pᴇʜ

    29/06/2015 a las 15:00

  • Sí, probablemente tengas razón. Iré con él al final, supongo.

    – menos azucar

    29 de junio de 2015 a las 15:01

Ejemplo:

User::where('id', '>', 0)
    ->update(['column_c' => DB::raw('`column_a` + `column_b`']);

  • Un poco más de explicación y no solo el código en sí hubiera estado bien. 😉

    – Alexander Doberning

    24 de enero de 2021 a las 9:25

  • No veo una gran diferencia con respecto a la respuesta aceptada, cambió la identificación a 0 desde 1 y reemplazó concat con +, pero eso no parece ser una solución diferente para mí.

    – Ruli

    24 de enero de 2021 a las 10:10

¿Ha sido útil esta solución?