with texto strip_tags remove quitar para limpiar funcion etiquetas ejemplo php laravel laravel-4 eloquent

php - texto - strip_tags wordpress



ActualizaciĆ³n masiva del modelo elocuente (3)

Por favor, corrígeme si me equivoco, pero creo que no existe la actualización masiva en un modelo Eloquent.

¿Hay alguna manera de hacer una actualización masiva en la tabla DB sin emitir una consulta para cada fila?

Por ejemplo, ¿hay un método estático, algo así como

User::updateWhere( array(''age'', ''<'', ''18''), array( ''under_18'' => 1 [, ...] ) );

(Sí, es un ejemplo tonto, pero te haces una idea ...)

¿Por qué no hay tal característica implementada? ¿Soy el único que sería muy feliz si surge algo como esto?

Yo (los desarrolladores), no me gustaría implementarlo como:

DB::table(''users'')->where(''age'', ''<'', ''18'')->update(array(''under_18'' => 1));

porque a medida que el proyecto crezca, podemos requerir que los programadores cambien el nombre de la tabla en el futuro y no puedan buscar y reemplazar el nombre de la tabla.

¿Hay un método tan estático para realizar esta operación? Y si no lo hay, ¿podemos extender la clase Illuminate/Database/Eloquent/Model para lograr tal cosa?


Para las funciones de actualización / inserción masiva, se solicitó, pero Taylor Otwell (autor de Laravel) sugirió que los usuarios deberían utilizar Query Builder en su lugar. https://github.com/laravel/framework/issues/1295

Sus modelos generalmente deberían extender Illuminate / Database / Eloquent / Model. Luego accede a la entidad en sí, por ejemplo, si tiene esto:

<?php Use Illuminate/Database/Eloquent/Model; class User extends Model { // table name defaults to "users" anyway, so this definition is only for // demonstration on how you can set a custom one protected $table = ''users''; // ... code omited ...

Actualización # 2

Tienes que recurrir al generador de consultas. Para cubrir el problema de nomenclatura de tablas, puede obtenerlo dinámicamente a través del método getTable (). La única limitación de esto es que necesita inicializar su clase de usuario antes de poder usar esta función. Su consulta sería la siguiente:

$userTable = (new User())->getTable(); DB::table($userTable)->where(''age'', ''<'', 18)->update(array(''under_18'' => 1));

De esta forma, su nombre de tabla es controlador en el modelo de usuario (como se muestra en el ejemplo anterior).

Actualización # 1

Otra forma de hacer esto (no eficiente en su situación) sería:

$users = User::where(''age'', ''<'', 18)->get(); foreach ($users as $user) { $user->field = value; $user->save(); }

De esta manera, el nombre de la tabla se mantiene en la clase de usuarios y sus desarrolladores no tienen que preocuparse por ello.


Quizás esto no fue posible hace unos años, pero en versiones recientes de Laravel definitivamente puedes:

User::where(''age'', ''<'', 18)->update([''under_18'' => 1]);

Vale la pena señalar que necesita el método where antes de llamar a la update .


Utilice las transacciones de la base de datos para actualizar varias entidades de forma masiva. La transacción se confirmará cuando su función de actualización finalice, o se retrotraerá si la excepción ocurre en algún punto intermedio.

https://laravel.com/docs/5.4/database#database-transactions

Por ejemplo, así es como regenero los slugs de ruta materializados ( https://communities.bmc.com/docs/DOC-9902 ) para artículos en una sola actualización masiva:

public function regenerateDescendantsSlugs(Model $parent, $old_parent_slug) { $children = $parent->where(''full_slug'', ''like'', "%/$old_parent_slug/%")->get(); /DB::transaction(function () use ($children, $parent, $old_parent_slug) { /** @var Model $child */ foreach ($children as $child) { $new_full_slug = $this->regenerateSlug($parent, $child); $new_full_title = $this->regenerateTitle($parent, $child); /DB::table($parent->getTable()) ->where(''full_slug'', ''='', $child->full_slug) ->update([ ''full_slug'' => $new_full_slug, ''full_title'' => $new_full_title, ]); } }); }