如何使用不在数据库中的自定义属性保存模型? - Laravel 5.4

时间:2017-07-11 07:50:36

标签: php laravel laravel-5.4

我有一种情况,我在模型上设置了一些自定义属性。这些属性不存在于数据库中。在模型上使用->isDirty()时,我会获得不属于数据库的自定义属性。

在保存模型之前,是否有一些干净的方法可以删除这些存在?

$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?!

我当然可以取消它们unset($model->custom_not_in_database_attribute),但我想知道是否有更清洁的方法可以做到这一点?

像(不存在)$model->saveOriginalOnly()

之类的东西

3 个答案:

答案 0 :(得分:3)

您可以像这样使用getAttributes()和getOriginal():

    $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);

答案 1 :(得分:2)

我的完整解决方案是将此方法添加到自定义基本模型中。它保存了原始字段。但保留自定义属性。

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;
}

另请参阅:https://codeneverlied.com/how-to-save-a-model-with-custom-attributes-that-are-not-in-the-database-laravel-5-4/

答案 2 :(得分:2)

一种更简单的方法就是像下面这样添加该属性作为模型的属性:

class Land extends Eloquent {

public $thisFieldWontBeSavedInDatabase;

//...

}

就完成了。

有了这个简单的声明,雄辩的就不会触发__set()方法添加到$ attributes属性中。并且只有$ attributes属性中的字段才保存在数据库中。