2016-03-02 11 views
7

İki model, kullanıcı ve rol arasında çok fazla ilişki var. Save() yöntemini kullanarak ve attach() yöntemini kullanarak ilişki kaydetme arasında fark var mı?Laravel 5 - Many to Many - Attach versus Kaydet

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

İki eşdeğeri mi? Ben şahsen farkı göremiyorum. Düşünceler?

cevap

7

İşte save() yönteminin kod snippet'i. Sonunda attach()'u aradığını göreceksiniz.

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

Büyük bir fark, ona geçirdiğiniz modeli de kaydetmesidir. Diğer bir deyişle, kullanıcıya eklerken yeni bir rol oluşturabilir (hatta eski olanı güncelleyebilirsiniz). Örneğin,

// 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

Rolleri tablosunda olmayan bir kullanıcıya yeni bir rol kaydeder(), rolleri veritabanında yeni bir rol kaydı oluşturur? Yani temelde bir save() kullanarak bize asla bir hata vermeyecektir, ancak eğer bir rol yoksa bir attach() bize yabancı bir anahtar hatası verebilir mi? – alaboudi

+0

@alaboudi Bir anlamda, evet, ama inanıyorum() 'bir modelin yeni bir örneğini geçerseniz bir hata alamaz. Hiçbir şey eklenmez çünkü model veritabanında mevcut değildir. Bununla birlikte, 'save()', eğer mevcut değilse ya da eklemeden önce güncellenmesi gerekiyorsa, onu güncellemeden önce veritabanına kaydetmenin ek adımı olacaktır. –

+1

Fantastik cevap – alaboudi