2015-07-10 2 views
19

В Laravel 5.1 можно видеть, что отношения столбцов таблицы могут быть настройки 2-мя способами:миграции иностранных Ключевые Vs Красноречивые Отношения в Laravel

1) Определение внешних ключей в таблице миграции.

2) Определение отношений между людьми в моделях.

Я прочитал документацию, и я до сих пор путают на следующее:

  1. мне нужно использовать оба или только один нужен ли?

  2. Неправильно ли использовать оба устройства одновременно? Или это делает избыточным или вызывает конфликты?

  3. В чем преимущество использования взаимопонимания без упоминания Внешние ключи в столбце миграции?

  4. В чем разница?

Это коды, которые у меня есть сейчас. Его все еще неясно, если мне нужно удалить внешние ключи, которые я установил в своем файле миграции.

миграция:

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'); 
     });  
    } 

Модель с красноречивыми отношениями:

// 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'); 
    } 
} 

Может кто-то помочь мне понять это, пожалуйста?

ответ

18

Оба идут рука об руку. Один из них в полном объеме без другого. Если вы хотите идеально работать с вашими отношениями, вам нужно определить обе вещи.

Если вы только что определили внешний ключ в файле миграции, отношение будет работать, но на всякий случай вы напишите необработанный запрос. Он не будет работать на ваших моделях; так как вы ничего не писали об отношениях в своих моделях.

Итак, как только вы напишете hasMany в одной из ваших моделей и соответствующую функцию в другой модели, только тогда ваша модель узнает об этом, а затем вы успешно запросите вещи через вашу модель, а также в своей базе данных.

Также обратите внимание, что если вы правильно определить отношения через hasMany и belongsTo в вашей модели, но не предоставили внешний ключ в таблице модели, которые belongsTo других таблицы, ваши отношения не будут работать.

Иными словами, оба они одинаково обязательны.

+0

идеально. Вот что я смутил и благодарю вас за подтверждение этого для меня. Если вы посмотрите на мои коды миграции и модели выше, выполнил ли я взаимосвязь отношений и ограничений внешнего ключа правильно? Это моя первая попытка и просто интересно, правильно ли я нахожусь на этом пути. Еще раз спасибо @ArslanAli – Neel

+0

@Neel. Для обзора вашего кода вы можете опубликовать свой код по адресу http://codereview.stackexchange.com/ и можете получить достойный (я надеюсь) обзор об этом. Благодарю. –

+0

извините, я не уверен, что я правильно понимаю это предложение: 'но не предоставил внешний ключ в таблице модель, которая принадлежит другой таблице, ваши отношения не будут работать.' – Neel

2

Eloquent предполагает внешний ключ отношения, основанный на имени модели.В этом случае модель App автоматически предполагается иметь app_id внешний ключ, так что в ваших миграциях вам не нужно указать:

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

Documentation

Смежные вопросы