简体   繁体   中英

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

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+

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM