外键约束在现有键上失败

时间:2015-12-17 17:19:08

标签: php mysql laravel eloquent

在现有的Laravel项目中,我们在mysql数据库中插入新记录时遇到了一个模糊的问题。工作流是这样的,每当我们创建一个新的公司时,我们也创建属于该公司的用户,不知何故在提交新用户时,外键约束失败,而我们100%确定密钥存在,并且我们有正确的钥匙在手中。

更奇怪的是,有时创作进展顺利,我们可以在此之后插入很多用户而没有任何问题。

我希望有人能指出我正确的方向,如何继续或进一步调试。

编辑:我添加了一些代码,我不认为这里有什么特别的,除了外键上的可空。这是一个相对较新的补充,因为不是每个用户都属于公司,所以这就是我添加那个用户的原因。

我认为问题是:当您知道(验证)此密钥存在时,外键如何失败,是正确的密钥并且100%确定正确的类型。

    $company = new Company();
    $company->fill($request->all());
    $company->showLicence = (int)$request->get('showLicence');

    $company->save();

    //create a zero-user for each company to be able to login support    staff
    $user = new User();

    $user->name = "user";

    $user->password = bcrypt('password');
    $user->company_id = $company->id;
    $user->save();

//user migration
Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password', 60);
        $table->rememberToken();
        $table->timestamps();
        $table->string('profession');
        $table->integer('productivity');
        $table->date('birthDay');
        $table->boolean('active');
        $table->string('standardCalendar');
        $table->string('calendar');
        $table->integer('department')->unsigned();

        $table->integer('company_id')->unsigned()->nullable();

        $table->foreign('company_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');
    });

    Schema::create('companies', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->string('companyName');
        $table->string('street');
        $table->string('zipcode');
        $table->string('city');
        $table->string('phone');
        $table->string('fax');
        $table->string('email');
        $table->string('website');
        $table->string('logo');
        $table->string('taxNumber');
        $table->string('welcome');
        $table->boolean('showLicence');
    });

1 个答案:

答案 0 :(得分:0)

在迁移代码中,company_id上的外键users实际上是指自身,而不是company表。将->on('users')更改为->on('companies')

作为附加提示,如果您的Company Eloquent模型具有users关系(返回$this->hasMany('User');的方法),则可以按如下方式插入新用户:

$user = $company->users()->create([
    'name' => 'user',
    'password' => bcrypt('password'),
]);