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 comoconcat
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