2012-11-24 43 views
13

Tôi biết bạn có thể xác định mối quan hệ bảng khá dễ dàng với $this->belongs_to(), $this->has_many() v.v ... nhưng những gì tôi không hiểu là cách tạo bảng mối quan hệ; bảng liên kết hai bảng với nhau (tôi đã quên thuật ngữ được gọi là gì).Mối quan hệ Laravel trong di chuyển?

Giả sử tôi đang tạo bảng người dùng. Tôi muốn người dùng đó thuộc về một "Vai trò" nhất định. Có nhiều vai trò và mỗi vai trò có thể có nhiều người dùng. Tôi cũng sẽ cần phải tạo một bảng roles cho điều đó. Càng xa càng tốt.

Nhưng sau khi đọc tài liệu, nó nói rằng tôi nên thêm $this->belongs_to() vào mô hình, chứ không phải bản thân di chuyển. Khi nào, và bảng quan hệ được tạo như thế nào? Nếu tôi tạo các bảng rolesusers và thêm $this->belongs_to('roles') vào kiểu users$this->has_many('users') vào mô hình roles, bảng giữa có được tạo tự động không?

+0

Về "tôi quên cụm từ được gọi là", các bảng này thường được gọi là Bảng tổng hợp, Bảng trung gian hoặc Bảng tra cứu tùy thuộc vào nền DB bạn đang dùng. –

Trả lời

0

Theo như tôi biết, không có bảng mối quan hệ nào được tạo. Những gì bạn cần làm là có một số role_id trên bảng users của mình, để khi bạn tạo người dùng, ID của vai trò sẽ được lưu trữ ở đó. Điều này sẽ cho phép bạn chọn tất cả người dùng trong đó role_id == '1' hoặc bất kỳ điều gì có thể. Ví dụ:

$admins = User::where('role_id', '=', 1); 

ở đâu trên bảng ROLES kỷ lục với ID='1' là admin. Vì vậy, một lần nữa để trả lời câu hỏi của bạn, không có bảng mối quan hệ được tạo ra, thay vào đó mối quan hệ tồn tại trong hai bảng của bạn dưới dạng một cột role_id cho mỗi người dùng. Ngoài quan tâm, bạn có đang sử dụng khóa ngoại không?

Nếu bạn muốn có một bảng các mối quan hệ bạn có thể tạo một gọi user_roles hoặc một cái gì đó và lưu trữ các role_iduser_id trong đó, tuy nhiên tôi nghĩ rằng nó dễ dàng hơn để sử dụng các phương pháp trên như sau đó bạn có thể sử dụng tất cả các Laravel/tốt đẹp hùng biện .

Hope this helps :)

+1

Cảm ơn bạn đã trả lời! Tôi đã tìm ra rằng không có bảng quan hệ nào là cần thiết nếu tôi chỉ lưu trữ một vai trò cho mỗi người dùng. Nhưng nếu mọi người dùng có thể có vai trò không giới hạn thì sao? Sau đó, tôi không có lựa chọn nào khác ngoài việc lưu trữ nó trong một bảng khác, đúng không? Làm thế nào mà sẽ làm việc? Tôi biết Laravel có thể tạo và quản lý các bảng này tự động cho bạn, nhưng tôi không biết làm thế nào, ở đâu hoặc khi nào nó thực hiện nó. – qwerty

+0

Vì vậy, điều nào là tốt hơn, cho dù tạo quan hệ trên cơ sở dữ liệu bằng cách thay đổi tệp di chuyển hay chỉ xác định các mối quan hệ trong các tệp mô hình? hoặc sử dụng cả hai kỹ thuật –

30

Khi tạo một sự chuyển đổi bạn có thể chỉ định các phím nước ngoài trên bảng của bạn, ví dụ:

public function up() 
{ 
    Schema::table('roles', function(Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('user_id')->unsigned(); 
     //rest of fields then... 
     $table->foreign('user_id')->references('id')->on('users'); 
    }); 
} 

này sẽ tạo ra một khoá ngoại trên cột user_id trên bàn vai trò. Lợi ích của khóa ngoại là khi cập nhật hoặc xóa được thực hiện bảng khóa ngoài sẽ được cập nhật tự động hoặc mô tả tuyệt vời "xếp chồng" được tìm thấy here

Như được mô tả trong tài liệu Laravel, bạn cũng có thể chỉ định tầng của mình khi cập nhật bằng cách sử dụng cú pháp sau

$table->foreign('user_id') 
    ->references('id')->on('users') 
    ->onDelete('cascade'); 

tôi sẽ làm một công việc xấu của cố gắng để giải thích nó tốt hơn so với các tài liệu không vì vậy hãy có một đọc qua phần "Relationships" của tài liệu hùng biện ORM để xem nó được thực hiện như thế nào.

+0

@Roark có thể bạn đã đề cập rằng cột "user_id" phải được tạo đầu tiên .. nếu không bạn sẽ gặp lỗi như: '' ' [Illuminate \ Database \ QueryException] SQLSTATE [42703] : Cột không xác định: 7 LRI: cột "lang_id" được tham chiếu trong ràng buộc khóa ngoài không tồn tại (SQL: thay đổi bảng "op_cities" thêm ràng buộc "op_cities_lang_i d_foreign" khóa ngoại ("lang_id") tham chiếu "translator_languages" ("id")) '' ' – abbood

+0

ví dụ về điều đó tại đây: https://www.easylaravelbook.com/blog/adding-foreign-key-references-using-a-laravel-migration/ – abbood

+1

@abbood Cập nhật câu trả lời để hiển thị ví dụ di chuyển chi tiết hơn – Roark

10

Nó trông giống như một vài trong số các câu hỏi ban đầu đã không bao giờ trả lời, tức là "Khi nào, và làm thế nào là bảng mối quan hệ tạo ra" & "sẽ bảng giữa được tạo tự động":

Theo như tôi biết , các bảng này cần được tạo theo cách thủ công.Vì vậy, tạo tệp di chuyển như vậy:

php artisan migrate:make create_role_user_table 

Lưu ý rằng các tên là số ít và được trình bày theo thứ tự bảng chữ cái.

Sau đó, trong một cái gì đó di cư như:

public function up() 
{ 
    Schema::create('role_user', function($table) { 
     $table->increments('id'); 
     $table->integer('role_id'); 
     $table->integer('user_id'); 
     $table->timestamps(); 
    }); 
} 

Hy vọng rằng sẽ giúp. Tôi không chắc liệu dấu thời gian có cần thiết trong Pivot Table hay không, vì vậy hãy thử nghiệm.

+1

'migrate: make' không có trong artisan cho Laravel 5.4, đó là' php artisan make: migration' –

7

Mặc dù một bài đăng cũ của nó, mặc dù tôi có thể đóng góp nội dung nào đó được cập nhật. Đối với Laravel5, Jeffrey Way đã phát triển một gói Laravel5 Generators-extended trong đó tăng cường khả năng phát của php artisan cho

  • make:migration:schema
  • make:migration:pivot
  • make:seed

Đối với nhiều-nhiều mối quan hệ giữa người dùng và vai trò, bạn chỉ có thể sử dụng

php artisan make:migration:pivot users role 

và nó sẽ tạo lớp di chuyển bắt buộc. Bạn không cần mã theo cách thủ công cho việc này.

0

Video này đã giúp tôi.

https://laracasts.com/series/laravel-5-fundamentals/episodes/14

là gì đáng ngạc nhiên đối với tôi là chỉ một bên của mối quan hệ cần pointer_id trong bảng di cư, không phải cả hai. Ví dụ: nếu chúng tôi có Tác giả với nhiều Bài viết, chúng tôi chỉ thêm

$table->integer('author_id') 

để di chuyển bài viết và làm như vậy.

0

Tôi biết đây là một bài đăng cũ nhưng tôi đã có cùng một câu hỏi trong đầu. Tôi đã tìm thấy giải pháp trong Laravel manual (5.0) nơi nó được mô tả mà cho đặc biệt này nhiều-nhiều mối quan hệ bạn có thể tạo bảng bằng tay và sau đó tuyên bố kiểu quan hệ vào mẫu theo cách này:

return $this -> belongsToMany('App\<Model>', '<table_created_manually>'); 

hoặc nếu bạn muốn sử dụng các khóa được liên kết cụ thể:

return $this -> belongsToMany('App\<Model>', '<rel_table1_table2>' '<table1>_id', '<table2>_id'); 

Hy vọng điều này có thể hữu ích.

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