2015-07-10 20 views
19

Trong Laravel 5.1 Tôi có thể thấy rằng các mối quan hệ cột bảng có thể được thiết lập trong 2 cách sau:Migration Ngoại chính Vs hùng biện mối quan hệ trong Laravel

1) Xác định Keys nước ngoài trong bảng Migration.

2) Xác định mối quan hệ Eloquent trong Mô hình.

Tôi đã đọc các tài liệu và tôi vẫn còn nhầm lẫn về sau:

  1. Tôi có cần phải sử dụng cả hai hay chỉ 1 là cần thiết?

  2. Sử dụng cả hai cùng một lúc có sai không? Hay nó làm cho nó trở thành dư thừa hoặc gây xung đột?

  3. Lợi ích của việc sử dụng mối quan hệ Eloquent mà không đề cập đến Khóa ngoại trong cột di chuyển là gì?

  4. Sự khác biệt là gì?

Đây là những mã tôi hiện có. Nó vẫn không rõ ràng với tôi nếu tôi cần phải loại bỏ các phím nước ngoài tôi đã thiết lập trong tập tin di chuyển của tôi.

Migration:

public function up() 
    { 

     Schema::create('apps', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->string('app_name'); 
      $table->string('app_alias'); 
      $table->timestamps(); 
      $table->engine = 'InnoDB'; 
     }); 

     // This is the second Migration table 
     Schema::create('app_roles', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->integer('app_id')->unsigned()->index(); 
      $table->integer('user_id')->unsigned()->index(); 
      $table->integer('role_id')->unsigned()->index(); 
      $table->engine = 'InnoDB'; 

      $table->unique(array('app_id', 'user_id')); 

      $table->foreign('app_id') 
       ->references('id') 
       ->on('apps') 
       ->onDelete('cascade'); 

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

      $table->foreign('role_id') 
       ->references('id') 
       ->on('roles') 
       ->onDelete('cascade'); 
     });  
    } 

mẫu với hùng biện mối quan hệ:

// App Model 
class App extends Model 
{ 

    public function appRoles() { 
     return $this->hasMany('App\Models\AppRole'); 
    } 
} 

// AppRole Model 
class AppRole extends Model 
{ 
    public function app() { 
     return $this->belongsTo('App\Models\App'); 
    } 

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

    public function role() { 
     return $this->belongsTo('App\Models\Role'); 
    } 
} 

// User Model 
class User extends Model implements AuthenticatableContract, CanResetPasswordContract 
{ 
    ..... 
    public function appRole() { 
     return $this->belongsToMany('App\Models\AppRole'); 
    } 
} 

// Role Model 
class Role extends EntrustRole 
{ 
    public function appRole() { 
     return $this->hasMany('App\Models\AppRole'); 
    } 
} 

Ai đó có thể giúp tôi hiểu được điều này xin vui lòng?

Trả lời

18

Cả hai đều đi đôi với nhau. Một là hoàn toàn không có cái khác. Nếu bạn muốn làm việc một cách hoàn hảo, bạn cần xác định cả hai thứ.

Nếu bạn vừa xác định khóa ngoại trong tệp di chuyển, quan hệ sẽ hoạt động nhưng chỉ trong trường hợp bạn viết truy vấn thô. Nó sẽ không hoạt động trên các mô hình của bạn; kể từ đó, bạn đã không viết bất cứ điều gì về quan hệ trong các mô hình của bạn. Vì vậy, ngay khi bạn viết hasMany vào một trong các mô hình của bạn, và chức năng tương ứng trong mô hình khác, chỉ sau đó mô hình của bạn biết về nó, và sau đó bạn truy vấn thành công mọi thứ thông qua mô hình của bạn cũng như trong cơ sở dữ liệu của bạn. Cũng cần lưu ý rằng nếu bạn đã xác định đúng quan hệ qua hasManybelongsTo trong các mô hình của mình, nhưng chưa cung cấp khóa ngoài trong bảng của mô hình belongsTo bảng khác, quan hệ của bạn sẽ không hoạt động.

Tóm lại, cả hai đều bắt buộc như nhau.

+0

hoàn hảo. Đó là những gì tôi đã nhầm lẫn và cảm ơn bạn đã xác nhận điều đó đối với tôi. Hãy xem nhanh mã Migration and Model của tôi ở trên, tôi đã thực hiện việc liên kết các mối quan hệ và ràng buộc khóa ngoài chính xác chưa? Đây là nỗ lực đầu tiên của tôi và tự hỏi liệu tôi có đang đi đúng hướng với nó hay không. Một lần nữa xin cảm ơn @ArslanAli – Neel

+0

@Neel Để xem xét mã của bạn, bạn có thể đăng mã của mình tại http://codereview.stackexchange.com/ và có thể nhận được đánh giá phong nha (tôi hy vọng) về nó. Cảm ơn. –

+0

xin lỗi, tôi không chắc chắn nếu tôi hiểu câu này đúng: 'nhưng không cung cấp khóa nước ngoài trong bảng mô hình người thuộc về bảng khác, quan hệ của bạn sẽ không hoạt động.' – Neel

2

Eloquent giả định khóa ngoại của mối quan hệ dựa trên tên mẫu.Trong trường hợp này, mô hình App được tự động giả định có một khóa ngoại app_id, vì vậy trong cuộc di cư của bạn, bạn không cần phải ghi rõ:

$table->foreign('app_id') 
->references('id') 
->on('apps') 
->onDelete('cascade'); 

Documentation

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