2014-10-02 21 views
14

Tôi không chắc liệu mình có hiểu phương thức associate trong Laravel hay không. Tôi hiểu ý tưởng, nhưng dường như tôi không thể làm được.Không thể liên kết Laravel với công việc

Với điều này (cất) mã:

class User 
{ 

    public function customer() 
    { 
     return $this->hasOne('Customer'); 
    } 

} 

class Customer 
{ 

    public function user() 
    { 
     return $this->belongsTo('User'); 
    } 

} 

$user = new User($data); 
$customer = new Customer($customerData); 

$user->customer()->associate($customer); 

tôi nhận được một Call to undefined method Illuminate\Database\Query\Builder::associate() khi tôi cố gắng chạy này.

Từ những gì tôi có thể đọc, tôi thực hiện chính xác như được nêu trong tài liệu.

Tôi đang làm gì sai?

Trả lời

20

Tôi phải thừa nhận rằng khi lần đầu tiên tôi bắt đầu sử dụng Laravel các mối quan hệ mà phần mà tôi phải liên tục tham khảo lại các tài liệu cho và thậm chí sau đó trong một số trường hợp tôi đã không hoàn toàn làm cho nó đúng.

Để giúp bạn, associate() được sử dụng để cập nhật mối quan hệ belongsTo(). Nhìn vào mã của bạn, lớp được trả về từ $user->customer() là một lớp mối quan hệ hasOne và sẽ không có phương thức liên kết trên đó.

Nếu bạn làm theo cách khác.

$user = new User($data); 
$customer = new Customer($customerData); 

$customer->user()->associate($user); 
$customer->save(); 

Nó sẽ hoạt động như $customer->user() là mối quan hệ belongsTo.

Để làm điều này theo cách khác vòng đầu tiên bạn sẽ tiết kiệm mô hình người dùng và sau đó lưu các mô hình khách hàng để nó thích:

$user = new User($data); 
$user->save(); 

$customer = new Customer($customerData); 
$user->customer()->save($customer); 

Edit: Nó có thể không cần thiết để tiết kiệm các mô hình sử dụng đầu tiên nhưng tôi đã luôn luôn làm điều đó, không chắc chắn lý do tại sao.

+0

Có, điều đầu tiên của bạn dường như hoạt động chính xác. Tôi nghĩ rằng đó là kinda lẻ rằng nó đã làm việc theo cách đó xung quanh. Anyhoe, cảm ơn. Và để bạn có thể học được điều gì đó mới: $ user-> push(); lưu người dùng và tất cả các mối quan hệ của nó. – Matthijn

+0

Điều cần biết, cảm ơn Matthijn –

5

Như tôi đã hiểu, ->associate() có thể được gọi trên mối quan hệ BelongsTo. Vì vậy, trong ví dụ của bạn, bạn có thể do $customer->user()->associate($user). Tuy nhiên, để 'liên kết' mối quan hệ Có * mà bạn sử dụng ->save(), do đó, mã của bạn phải là $user->customer()->save($customer)

+0

có cùng sự cố. nhưng trên quan hệ thuộc vềToMany(). làm cách nào để khắc phục sự cố này? cảm ơn – aleXela

+0

Đối với nhiều phương thức nhiều (xem tài liệu https://laravel.com/docs/5.3/eloquent-relationships#updating-many-to-many-relationships) bạn sử dụng '-> attach()' và ' -> tách() '. Ví dụ. '$ post-> tags() -> đính kèm ($ tag);' Bây giờ, chính thức, phương thức đính kèm và tách chỉ chấp nhận ID, nhưng khi tôi thử nghiệm điều này một thời gian trước đây vào ngày 4.x, bạn có thể truyền các mô hình thực tế vào. Điều đó có thể đã thay đổi cho 5.x. – alexrussell

+0

loại này hoạt động. nhưng yêu cầu của nó cho một mảng, và tôi nhận được đối tượng thay thế. – aleXela

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