2017-07-11 5 views
0

モデルにカスタム属性を設定している状況があります。これらの属性はデータベースに存在しません。モデル上で->isDirty()を使用すると、データベースに属していないカスタム属性が取得されます。データベースにないカスタム属性を使用してモデルを保存するにはどうすればよいですか? - Laravel 5.4

モデルを保存する前にこれらの属性を削除する方法はありますか?

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

答えて

1

あなたは(の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); 
+0

私はこのようなことをするつもりですが、カスタムベースモデルでメソッドを作成すると思います。物事はまだ未設定のプロパティが必要です。だから私は一時的に保存しなければなりません。 –

+0

属性を作成して削除する必要がある場合は、モデルに「永久」属性を作成し、毎回削除せずに使用することができます。あなたのUser.php(モデル)の例:public function getFullNameAttribute(){ $ this-> first_nameを返します。 ''。 $ this-> last_name; }あなたのビューでは、$ user-> full_name;を呼び出すことができます)(first_nameとlast_nameは本当の属性です) – sam12

+0

私のための完全な解決策は、以下に述べられています。 –

0

私のための完全なソリューションは、カスタムベースモデルに、このメソッドを追加しました。元のフィールドを保存します。しかし、カスタム属性を保持します。

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; 
} 
関連する問題