2016-03-02 26 views
7

Tôi có mối quan hệ nhiều đến nhiều giữa hai mô hình, người dùng và vai trò. Có sự khác biệt nào giữa việc lưu mối quan hệ bằng phương thức save() và sử dụng phương thức attach() không?Laravel 5 - Nhiều đến nhiều - Đính kèm so với Lưu

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

Hai tài khoản tương đương phải không? Cá nhân tôi không thấy sự khác biệt. Suy nghĩ?

Trả lời

7

Đây là đoạn mã cho phương thức save(). Bạn sẽ thấy rằng nó cuối cùng gọi 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; 
} 

Một điểm khác biệt lớn là nó cũng lưu mô hình bạn đang chuyển đến. Nói cách khác, về cơ bản bạn có thể tạo ra một vai trò mới (hoặc thậm chí cập nhật vai trò cũ) trong khi cũng gắn nó vào người dùng. Ví dụ:

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

Nếu tôi lưu() vai trò mới cho người dùng không tồn tại trong bảng vai trò, nó sẽ tạo bản ghi vai trò mới trong cơ sở dữ liệu vai trò? Vì vậy, về cơ bản bằng cách sử dụng một lưu() sẽ không bao giờ cho chúng ta một lỗi nhưng bằng cách sử dụng một đính kèm() có thể cung cấp cho chúng tôi một lỗi chính nước ngoài nếu vai trò không tồn tại? – alaboudi

+0

@alaboudi Trong một nghĩa nào đó, có, nhưng tôi tin rằng 'attach()' sẽ không ném một lỗi nếu bạn vượt qua một ví dụ mới của một mô hình. Nó sẽ không đính kèm bất cứ điều gì bởi vì mô hình không tồn tại trong cơ sở dữ liệu. Tuy nhiên, 'save()' sẽ thực hiện bước bổ sung để lưu nó vào cơ sở dữ liệu trước nếu nó không tồn tại hoặc cập nhật nó nếu nó cần được cập nhật trước khi đính kèm nó. –

+1

Câu trả lời tuyệt vời – alaboudi

Các vấn đề liên quan