Миграция иностранного ключа против красноречивых отношений в Ларавеле
В 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');
}
}
Может кто-нибудь помочь мне понять это, пожалуйста?
Ответы
Ответ 1
Оба идут рука об руку. Один из них в полном объеме без другого. Если вы хотите идеально работать с вашими отношениями, вам нужно определить обе вещи.
Если вы только что определили внешний ключ в файле миграции, отношение будет работать, но на всякий случай вы напишите необработанный запрос. Он не будет работать на ваших моделях; так как вы ничего не писали об отношениях в своих моделях.
Итак, как только вы напишете hasMany
в одной из ваших моделей и соответствующую функцию в другой модели, только тогда ваша модель узнает об этом, а затем вы успешно запросите вещи через вашу модель, а также в своей базе данных.
Также обратите внимание, что если вы правильно определили отношения через hasMany
и belongsTo
в своих моделях, но не указали внешний ключ в таблице модели, которая belongsTo
другая таблица, ваши отношения не будут работать.
Короче говоря, оба они одинаково обязательны.
Ответ 2
Eloquent предполагает внешний ключ отношения, основанный на имени модели. В этом случае модель App
автоматически предполагает наличие внешнего ключа app_id
, поэтому в ваших миграциях вам не нужно указывать:
$table->foreign('app_id')
->references('id')
->on('apps')
->onDelete('cascade');
Документация