在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');
}
}
有人能帮我理解一下吗?
$table->foreign('app_id')
->references('id')
->on('apps')
->onDelete('cascade');
文档
两者都是携手并进的。一个是完整的,没有另一个。如果你想让你们的关系正常工作,你需要定义这两件事。
如果您刚刚在迁移文件中定义了外键,该关系将在您编写原始查询时起作用。它对您的模型不起作用,因为您没有在模型中编写任何关于关系的内容。
因此,只要您在一个模型中编写了多个
,在另一个模型中编写了相应的函数,只有这样您的模型才能相互了解,然后您才能通过模型以及数据库成功地查询到内容。
还要注意,如果你已经通过在你的模型中的has很多
和属性到
正确定义了关系,但是在模型的表中没有提供外键的属性到
其他表,你的关系将不起作用。
简而言之,两者都是同等强制性的。
这是通过使用包含以下内容的SQL转储移植旧项目来学习Laravel(特别是v5.x)的一种尝试: 在垃圾堆的底部有一个与此特定表格相关的: 来自一对stackoverflow问题1、2、3;我修改了原始代码,将Schema::table的外键从Schema::create中拆分出来,并将unsigned()添加到每个字段: 但在使用新创建的空DB进行迁移时,仍然会出现错误: 根据MySQL,这意味
我试着补充: 并用调用,但响应为空。
我有以下三个表格: 所以基本上这种关系就像: 用户有许多项目 项目属性到客户端 我的问题是: 如何使用eloquent获得用户的所有客户端? 似乎我不能用户hasManyPass方法,因为在客户端表中没有project_id。 因此,我希望达到的目标是:
我正在编写php代码,对于当前的项目,我正在使用laravel框架(带有雄辩的ORM)。在这个项目中,我创建了两个表:用户和任务。我想在这些表之间创建一个“一对多”的关系。因此,一个用户可以有许多任务。在Tasks类中,我创建了方法所有者(): 但是当我以前得到用户名的时候 我得到这个异常:未定义的属性:illumb\Database\Eloquent\Relations\BelongsTo::$
我有三种模式——博客、帖子、评论。博客有很多帖子,帖子有很多评论 当我写作时 它会给所有的博客发帖子和评论。但我将如何获得那些由管理员用户创建的博客,即评论表中的用户id。在哪里写入
我是Laravel5.2的新手,正在开发一个遗留系统,对雄辩有点困惑,希望有人能给我代码。 共有3个表格: 卡片类别卡片2类 卡片可以是许多类别的一部分,这些类别保存在cards2cat表中。 cards2cat表的结构如下 id(主键)图像(卡)类别 我想做的是在Cards模型中有一个方法,名为getCardsWithCategors,它返回Cards信息和category表中类别的名称。 ca