Laravel 5.4 同步()上的 key 'PRIMARY' 的重复条目

标签 laravel eloquent laravel-5.4

我有 PlaylistTrack多对多关系与附加 order field :

Schema::create('playlist_track', function (Blueprint $table) {
    $table->integer('playlist_id')->unsigned();
    $table->integer('track_id')->unsigned();
    $table->integer('order')->unsigned();

    $table->primary(['playlist_id', 'order']);
});

用户可以从播放列表中删除轨道并更改顺序。所以这个sync方法是我需要的:
        foreach ( $tracks as $key => $track ){
            $_tracks[ $track ] = [ 'order' => $key ];
        }

        $playlist->tracks()->sync( $_tracks ); 

但是在尝试更改轨道顺序时出现错误:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3-0' for key 'PRIMARY' (SQL: update `playlist_track` set `order` = 0 where `playlist_id` = 3 and `track_id` = 1)

那是因为我在使用复合主键,我猜......但我不知道如何使它工作

UPD

这是 dd( $_tracks )
array:2 [
  1 => array:1 [
    "order" => 0
  ]
  3 => array:1 [
    "order" => 1
  ]
]

最佳答案

由于它是一个数据透视表,您不能将外键定义为主键,因此删除它:

$table->primary(['playlist_id', 'order'])

数据透视表可以具有非唯一性 playlist_id值,但带有 ->primary()你正在创建一个约束。

关于Laravel 5.4 同步()上的 key 'PRIMARY' 的重复条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45241431/

相关文章:

php - 如何从 Laravel 5.2 中的集合中获取相关模型?

php - Laravel 8 在 null 上调用成员函数 extension()

php - 尝试获取经过身份验证的用户时出错

php - 向 Laravel 中的选择查询添加一个具有值的新列

php - laravel try/catch 不适用于失败的查询

php - Laravel Eloquent 关系链

php - 如何在一个 Eloquent 查询中增加和更新列

php - Laravel/Eloquent 中按多个条件过滤模型

php - 如何防止 Laravel 中的重复文件名?

php - Laravel 5.4 字段没有默认值