我正在创建一个新的网络应用,其中有3个表:users
,teams
和project
:
以下是team
和project
迁移结构:
Schema::create('teams', function (Blueprint $table) {
$table->increments('id');
$table->string('team_image', 15);
$table->string('team_name', 50);
$table->string('team_description');
$table->timestamps();
});
Schema::create('project', function (Blueprint $table) {
$table->increments('id');
$table->integer('members')->unsigned();
$table->foreign('members')->references('id')->on('teams');
$table->string('name');
$table->string('description');
$table->string('lead');
$table->timestamps();
});
以下是Team
和Project
模型:
class Team extends Model
{
protected $table = 'teams';
public function projects()
{
return $this->hasMany('App\Project');
}
}
class Project extends Model
{
protected $table = 'project';
protected $fillable = ['name', 'description'];
public function teams()
{
return $this->belongsTo('App\Team');
}
}
修补我运行:
$team = factory('App\Team')->create();
我已经填充了db f fum mumbo jumbo,那没关系。但是当我试着打电话给项目时:
$team->projects()->create(['name'=>'project 1', 'description'=>'bla bla']);
我明白了:
Illuminate \ Database \ QueryException,消息为'SQLSTATE [42S22]: 未找到列:1054'字段列表'中的未知列'team_id'(SQL: 插入
project
(name
,description
,team_id
,updated_at
,created_at
)值(项目1,bla bla,2,2015-12-20 00:06:29, 2015-12-20 00:06:29))'
使用team_id
代替members
,在之前的一些迁移中使用过,但是我已经重新安装了迁移并更新了迁移文件并重新运行迁移,并且db很好,{{1列已创建。
当我将members
替换为members
时,修补程序将工作并将名称插入team_id
表。
任何线索?
答案 0 :(得分:1)
关系代码不知道任何数据库级别信息,例如外键约束。这是因为迁移仅用于创建表,它们与实际模型没有任何关联。
相反,外键的关系使用标准命名约定。它由附加字符串team
的相关模型的小写名称(在您的情况下为_id
)组成。因此它以team_id
结束,这就是当列以这种方式命名时它起作用的原因。如果您希望外键列具有非标准名称(例如members
),则需要在定义关系时指定:
class Team extends Model
{
protected $table = 'teams';
public function projects()
{
return $this->hasMany('App\Project', 'members');
}
}
one-to-many relationships上的Laravel文档解释说,在需要时,您可以将另外两个参数传递给hasMany
方法,外键和本地键列名称。