2016-03-02 13 views
7

私は2つのモデル、ユーザー、ロールの間に多対多の関係を持っています。 save()メソッドを使用して関係を保存する場合とattach()メソッドを使用する場合の違いはありますか?Laravel 5 - 多対多 - アタッチと保存の比較

$user->roles()->save($role, ['expires' => $expires]); //using save 
$user->roles()->attach($roleId, ['expires' => $expires]);// using attach 

2つは同等ですか?私は個人的に違いは見られません。思考?

答えて

7

save()メソッドのコードスニペットを次に示します。最終的にattach()が呼び出されます。

/** 
* Save a new model and attach it to the parent model. 
* 
* @param \Illuminate\Database\Eloquent\Model $model 
* @param array $joining 
* @param bool $touch 
* @return \Illuminate\Database\Eloquent\Model 
*/ 
public function save(Model $model, array $joining = [], $touch = true) 
{ 
    $model->save(['touch' => false]); 
    $this->attach($model->getKey(), $joining, $touch); 
    return $model; 
} 

大きな違いの1つは、渡すモデルを保存することです。つまり、基本的に新しい役割を作成したり、古い役割を更新したりすることができます。たとえば、

// Get the user 
$user = User::first(); 

// Instantiate a new role 
$role = new Role($attributes); 

// Creates the role/persists it into the database and attaches this role to the user 
$user->roles()->save($role, ['expires' => $expires]); 
+0

ロールテーブルに存在しないユーザーに新しいロールを保存すると、ロールデータベースに新しいロールレコードが作成されますか?だから基本的にsave()を使ってもエラーは出ませんが、もしroleが存在しなければattach()を使うと外部キーエラーが出るでしょうか? – alaboudi

+0

@alaboudiある意味では、そうですが、モデルの新しいインスタンスを渡すと、 'attach()'はエラーをスローしません。モデルがデータベースに存在しないため、何も付けられません。しかし、 'save()'はデータベースが存在しない場合は最初にデータベースに保存するか、更新前に更新する必要がある場合は更新する必要がある場合には追加します。 –

+1

すばらしい答え – alaboudi