Me encontré con un problema con Laravel que espero que alguien pueda ayudar a explicar. El comando de relleno no establece las propiedades del modelo y, en su lugar, solo se puede usar para guardarlas en la base de datos con la función ->save() . ¿Hay alguna manera de fill donde realmente establece las propiedades del modelo a partir de una matriz?
Ejemplo de problema a continuación.
$comment = new comment(); $comment->fill(['name' => 'Bob']); echo($comment->name); // Gives null/error. $comment = new comment(); $comment->name = 'Bob'; echo($comment->name); // Gives Bob.El motivo es que el nombre archivado no se puede completar en el modelo de comentarios. Para resolver este problema, debe agregar un campo que se pueda completar para ese campo en el modelo de comentarios.
protected $fillable = [ 'name', ];Si intenta acceder a un campo no rellenable, devolverá un valor nulo.
Si no desea agregarlo como rellenable, puede usar forceFill .
forceFill : Rellene el modelo con una matriz de atributos con asignación de masa de fuerza.
$comment = new comment(); $comment->forceFill(['name' => 'Bob']); echo($comment->name);Sí, debe usar la propiedad fillable del modelo y debe agregar un name dentro de la matriz fillable . Esa es la forma recomendada de hacerlo.
Como sugiere la respuesta de John Lobo , puede anular ese mecanismo a la fuerza usando forceFill o forceCreate . Ambos ignoran la propiedad rellenable en el modelo. Es posible que tenga una columna como is_admin y no desee actualizarla, pero la fuerza lo hará.
Notas :
El principal problema con forceCreate o forceFill , es que tenemos que gestionar la asignación de claves foráneas manualmente.
forceFill solo llenará (propiedades). Necesita guardar la llamada al método para guardar el registro real, mientras que forceCreate llenará (propiedades) y guardará ambos juntos.