Laravel 5.4关键' PRIMARY'重复输入在同步()

时间:2017-07-21 15:28:45

标签: laravel eloquent laravel-5.4

我与其他Playlist字段有Trackorder多对多关系:

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
  ]
]

2 个答案:

答案 0 :(得分:3)

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

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

数据透视表可以包含非唯一playlist_id值,但使用->primary()时,您可以创建约束。

答案 1 :(得分:1)

使用自动增量整数列作为主键:

$table->increments('id');