I have a situation where I have set some custom attributes on a model. These attributes don't exist in the database. When using ->isDirty()
on the model I get the custom attributes that don't belong in the database.
Is there some clean way to remove these attrbiutes before saving the model?
$model = SomeModel::find(1);
$model->database_attribute = 'I exists in the database';
$model->custom_not_in_database_attribute = 'I don\'t exists in the database';
$model->save(); // remove dirty on save?!
I can of course just unset them unset($model->custom_not_in_database_attribute)
, but I like to know if there is a cleaner way to do this?
Something like (not existing) $model->saveOriginalOnly()
An easier way to do is just to add this property as a model's property like this:
class Land extends Eloquent {
public $thisFieldWontBeSavedInDatabase;
//...
}
and it's done.
With this simple declaration, eloquent won't trigger the __set() method to add to the $attributes property. And only the fields in the $attributes property are saved in the database.
You can use getAttributes() and getOriginal() like this :
$model=Model::findOrFail($id);
$model->new='new';
foreach ($model->getAttributes() as $key => $value) {
if(!in_array($key, array_keys($model->getOriginal())))
unset($model->$key);
}
dd($model);
The full solution for me was adding this method to the custom base model. It saves the original fields. But keeps the custom attributes.
public function saveOriginalOnly()
{
$dirty = $this->getDirty();
foreach ($this->getAttributes() as $key => $value) {
if(!in_array($key, array_keys($this->getOriginal()))) unset($this->$key);
}
$isSaved = $this->save();
foreach($dirty as $key => $value) {
$this->setAttribute($key, $value);
}
return $isSaved;
}
See also: Save a model with custom attributes - Laravel 5.4+
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With