Laravel 5.4 同步()键“PRIMARY”的重复条目

fit*_*ter 4 laravel eloquent laravel-5.4

PlaylistTrack很多人有额外的一对多关系order领域:

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']);
});
Run Code Online (Sandbox Code Playgroud)

用户可以从播放列表中删除曲目并更改顺序。所以这个sync方法是我需要的:

        foreach ( $tracks as $key => $track ){
            $_tracks[ $track ] = [ 'order' => $key ];
        }

        $playlist->tracks()->sync( $_tracks ); 
Run Code Online (Sandbox Code Playgroud)

但是在尝试更改曲目顺序时出现错误:

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)
Run Code Online (Sandbox Code Playgroud)

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

UPD

这是 dd( $_tracks )

array:2 [
  1 => array:1 [
    "order" => 0
  ]
  3 => array:1 [
    "order" => 1
  ]
]
Run Code Online (Sandbox Code Playgroud)

Ale*_*nin 5

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

$table->primary(['playlist_id', 'order'])
Run Code Online (Sandbox Code Playgroud)

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