Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to save a model with custom attributes that are not in the database? - Laravel 5.4

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()

like image 601
Tim van Uum Avatar asked Jul 11 '17 07:07

Tim van Uum


3 Answers

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.

like image 21
Romain 'Maz' BILLOIR Avatar answered Sep 21 '22 22:09

Romain 'Maz' BILLOIR


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);
like image 127
misterdebug Avatar answered Sep 20 '22 22:09

misterdebug


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+

like image 45
Tim van Uum Avatar answered Sep 23 '22 22:09

Tim van Uum