插入到db时的laravel修补程序

时间:2015-12-20 00:15:17

标签: laravel migration

我正在创建一个新的网络应用,其中有3个表:usersteamsproject

以下是teamproject迁移结构:

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

以下是TeamProject模型:

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:   插入projectnamedescriptionteam_idupdated_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表。

任何线索?

1 个答案:

答案 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方法,外键和本地键列名称。