在现有的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');
});
答案 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'),
]);