首页 > 解决方案 > 违反完整性约束 - 1452 无法添加或更新子行

问题描述

当我尝试将数据保存到中间表中时,我遇到了多对多关系的问题。基本上,客户有很多观察结果,而我有tbl_cientsclients_hasmany_observationstbl_clients_observations

迁移中的外键:

Schema::connection('dev')->table('clients_hasMany_observations', function (Blueprint $table) {
    $table->foreign('client_id')->references('client_id')->on('tbl_clients');
    $table->foreign('observation_id')->references('observation_id')->on('tbl_clients_observations');
});

客户型号:

/**
 * The observations that belong to the client.
 */
public function observations()
{
    return $this->belongsToMany('App\ClientsObservations', 'clients_hasmany_observations', 'client_id', 'observation_id')->withTimestamps();
}

观察模型:

/**
 * The observations that belong to the client.
 */
public function clients()
{
    return $this->belongsToMany('App\Clients', 'clients_hasmany_observations', 'client_id', 'observation_id')->withTimestamps();
}

考虑到这一点,如果我尝试添加一个新客户端并附加一个虚拟观察,我会收到错误消息:

SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(helderne_devclients_hasmany_observations,CONSTRAINT clients_hasmany_observations_observation_id_foreignFOREIGN KEY(observation_id)参考tbl_clients_observationsobservati) (SQL: insert intoclients_hasmany_observations (client_id ,created_at ,observation_id ,updated_at`)值(4,2020-04-15 11 :05:09, 50, 2020-04-15 11:05:09))```

我真的不明白为什么,因为我添加了密钥。任何帮助将不胜感激!

编辑#1 在我正在写的控制器中:

$new_client = Clients::create($request->all());
$new_client->observations()->attach([50]);
dd($new_client);

50 将是 tbl_clients_observations 中观察的可能 ID。

标签: mysqllaravelconstraints

解决方案


我知道这是旧的,但根据文档,“第三个参数是您定义关系的模型的外键名称,而第四个参数是您要加入的模型的外键名称:

return $this->belongsToMany('App\Models\Role', 'role_user', 'user_id', 'role_id');"

所以我认为你可能在客户端功能上打开了外键。不确定它是否会解决所有问题,但请尝试切换它们:

public function clients()
{
    return $this->belongsToMany('App\Clients', 'clients_hasmany_observations', 'observation_id', 'client_id')->withTimestamps();
}


推荐阅读