在Laravel 5.1中,我可以看到表列关系可以通过两种方式设置:
1)在迁移表中定义外键。
2)在模型中定义雄辩关系。
我已经阅读过这些文件,我仍然对以下内容感到困惑:
我需要同时使用两者吗?
同时使用两者是不对的?或者它是否成功 多余或引起冲突?
使用Eloquent关系而不提及的有什么好处 迁移列中的外键?
有什么区别?
这些是我现在的代码。如果我需要删除我在迁移文件中设置的外键,我仍然不清楚。
迁移:
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');
}
}
有人可以帮我理解这个吗?
答案 0 :(得分:25)
两者齐头并进。一个是完整的而没有另一个。如果您希望关系正常工作,则需要定义这两种关系。
如果您刚刚在迁移文件中定义了外键,则只要您编写原始查询,该关系就会起作用。它不会对你的模型起作用,因为你还没有写过模型中关系的任何内容。
因此,只要您在其中一个模型中编写hasMany
,并在另一个模型中编写相应的函数,只有您的模型才能相互了解,然后您才能通过模型成功查询事物在您的数据库中。
另请注意,如果您在模型中通过hasMany
和belongsTo
正确定义了关系,但未在belongsTo
其他模型的表格中提供外键表,你的关系不起作用。
简而言之,两者都是同等强制性的。
答案 1 :(得分:4)
Eloquent根据模型名称假定关系的外键。在这种情况下,App
模型会自动假定具有app_id
外键,因此在迁移中您无需指定:
$table->foreign('app_id')
->references('id')
->on('apps')
->onDelete('cascade');