Подтвердить что ты не робот

Миграция иностранного ключа против красноречивых отношений в Ларавеле

В Laravel 5.1 я вижу, что отношения столбцов таблицы могут быть настроены двумя способами:

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

2) Определение отношений "Яркость" в моделях.

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

  • Нужно ли использовать оба или только 1?

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

  • Какая польза от использования отношений "Красноречивый" без упоминания Иностранные ключи в столбце миграции?

  • В чем разница?

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

Миграция:

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

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

4b9b3361

Ответ 1

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

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

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

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

Короче говоря, оба они одинаково обязательны.

Ответ 2

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

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

Документация