php 更新m2m关系时约束错误

gc0ot86w  于 2023-06-28  发布在  PHP
关注(0)|答案(1)|浏览(115)

我有一个M2M关系,连接表,在模型中设置为:

public function users()
{
    return $this->belongsToMany(User::class, 'user_alert', 'alert_id', 'user_id');
}

public function alerts()
{
    return $this->belongsToMany(Alert::class, 'user_alert', 'user_id', 'alert_id');
}

在编辑包含此行的警报时,我得到以下错误。

Alert::findOrFail($request->id)->users()->syncWithoutDetaching($users);
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`homestead`.`user_alert`, CONSTRAINT `user_alert_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE) (SQL: insert into `user_alert` (`alert_id`, `id`, `user_id`) values (43, 1, 0))

user_id参数0导致错误,我不知道它来自哪里。执行dd($users)显示类似于以下内容:

array:5 [
    0 => array:1 [
        "id" => 1
    ]
    1 => array:1 [
        "id" => 1
    ]
    2 => array:1 [
        "id" => 2
    ]
]

0首次出现在对/var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php的调用中

"file" => "/var/www/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/Concerns/InteractsWithPivotTable.php"
    "line" => 254
    "function" => "insert"
    "class" => "Illuminate\Database\Query\Builder"
    "type" => "->"
    "args" => array:1 [▼
      0 => & array:1 [▼
        0 => array:3 [▼
          "alert_id" => 43
          "id" => 1
          "user_id" => 0
        ]
      ]
    ]
  ]

令人沮丧的是,M2M关系在创建新警报时起作用。
我希望这不是太相关,但这是Laravel 7。
希望有人能给点建议!

xt0899hw

xt0899hw1#

问题出在$users数据的格式上。syncWithoutDetaching可以接受用户模型集合用户id数组。不支持您提供的格式,因为它将数组键(在您的示例中为0,1,2)作为用户ID。
因此,请为syncWithoutDetaching提供用户模型集合或用户ID数组。

相关问题