2015-06-08 25 views
11

Tôi muốn lưu chữ ký mới trong chữ ký bảng của mình. Mỗi chữ ký có thể được liên kết với người dùng nhiều người dùng. Tôi có một bảng nhiều đến nhiều người dùng và chữ ký.Laravel: Lưu mối quan hệ thuộc vềToToMany

Mẫu Chữ ký của tôi là:

class Signature extends Model { 
    public $fillable = ['name', 'template']; 

    public function users() { 
     return $this->belongsToMany('App\User'); 
    } 
} 

My khiển SigantureController.php là:

public function store(CreateSignaturesRequest $request) 
{ 
    //return $user_id; 
    $values = $request->only(['name','template']); 

    Signature::create($values)); 

    return response()->json(['message'=>'SUCCESS'], 201); 

} 

Làm thế nào tôi có thể làm để Tạo Chữ ký của tôi và liên kết nó với một người sử dụng?

tôi đã cố gắng

Signature::create($values)->associate($user_id); 

Cảm ơn

Trả lời

19

Xét bảng của bạn là người sử dụng, chữ ký và user_signatures

Xác định mối quan hệ trong mô hình: user.php

class User extends Model { 
    public function signatures() { 
     return $this->belongsToMany('\App\Signature', 'user_signatures'); 
    } 
} 

Xác định nghịch đảo của mối quan hệ trong mô hình: Chữ ký.php

class Signature extends Model {  
    public function users() { 
     return $this->belongsToMany('\App\User', 'user_signatures'); 
    } 
} 

Trong điều khiển của bạn, bạn có thể làm như sau:

//create a new signature 
$signature = new Signature($values); 
//save the new signature and attach it to the user 
$user = User::find($id)->signatures()->save($signature); 

Điều ngược lại là có thể quá:

$user = User::find($user_id); 
$signature = Signature::create($values)->users()->save($user); 

Ngoài ra nếu bạn có một chữ ký hiện tại bạn nên làm:

$user = User::find($id); 
$user->signature()->attach($signature->id); 

Xin lưu ý rằng attach() và detach() chấp nhận một id hoặc một mảng các id.

Tài liệu Laravel đã đề cập đến điều này trong nhiều chi tiết hơn và ví dụ tốt hơn. Bạn nên kiểm tra các phương thức attach(), detach() và sync(). Vui lòng xem: http://laravel.com/docs/5.0/eloquent#inserting-related-models

+0

Cảm ơn rất nhiều! Nó xảy ra rằng tôi có một bảng quan hệ có tên là user_signature và không phải signature_user, do đó, lệnh này cho tôi một lỗi vì bảng được nhắm mục tiêu không tồn tại. Bạn có biết tôi cần làm gì không? – Yobogs

+2

Thay đổi đối số thứ hai trong phương thức thuộc tính của bạn bằng tên bảng thích hợp. Điều đó nên chọn nó một cách độc đáo. –

4

Bạn cần phải có một bảng gọi là user_signature với giản đồ sau:

$table->integer('user_id')->unsigned(); 
$table->integer('signature_id')->unsigned(); 

$table->foreign('user_id')->references('id')->on('users'); 
$table->foreign('signature_id')->references('signatures')->on('users'); 

Sau đó, mô hình User của bạn nên có các phương pháp sau đây:

Model User

public function signatures() { 
    return $this->belongsToMany('App\Signature'); 
} 

Bây giờ bạn đã phát triển mối quan hệ Many-To-Many giữa các mô hình những gì bạn có thể làm là thế này:

Trong khi lưu trữ một kỷ lục mới (bộ điều khiển bạn đang sử dụng cho chữ ký):

/** 
* Insert the signature 
* 
* @param Request $request 
* @return ... 
*/ 
public function store(Request $request) { 
    // your validation 

    $signature->users()->attach($request->input('user_id')); 

    // return 
} 

Tương tự khi cập nhật hồ sơ (bộ điều khiển bạn đang sử dụng để ký):

/** 
* Update the signature with the particular id 
* 
* @param $id 
* @param Request $request 
* @return ... 
*/ 
public function update($id, Request $request) { 
    // your validation 

    $signature->users()->sync($request->input('user_id')); 

    // return 
} 
+0

Cảm ơn bạn rất nhiều, câu trả lời rất rõ ràng! Tuy nhiên, tôi cần phải lưu trữ ở phía chữ ký; không ở phía người dùng. Điều đó có thể không ? Làm sao ? – Yobogs

+1

Tôi đã chỉnh sửa câu trả lời, bạn có thể xem nó. –

2

Đầu tiên của tất cả các associate đòi hỏi một đối tượng mô hình được thông qua như là đối số. Xem tại đây: http://laravel.com/api/5.0/Illuminate/Database/Eloquent/Relations/BelongsTo.html#method_associate

Đây cũng là mối quan hệ của belongsTo, chứ không phải là Many to Many như trong trường hợp của bạn. Xem ở đây: http://laravel.com/docs/5.0/eloquent#inserting-related-models

Dựa trên những gì bạn cần làm là:

Signature::create($values)->users()->attach($user_id); 
+0

Cảm ơn rất nhiều! Nó xảy ra rằng tôi có một bảng quan hệ có tên là user_signature và không phải signature_user, do đó, lệnh này cho tôi một lỗi vì bảng được nhắm mục tiêu không tồn tại. Bạn có biết tôi cần làm gì không? – Yobogs

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