Laravel 5:完整性约束违规:1062 - 多对多

时间:2015-12-01 14:07:33

标签: php laravel

我需要一些关于以下方面的建议。

我有2次迁移,就像这样。

        Schema::create('plates', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('serial_number');
        $table->string('crc-code', 50);
        $table->string('reason', 50)->nullable();

        $table->softDeletes();

        $table->timestamps();
    });

另一个

  Schema::create('documents', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name', 25)->unique();
        $table->text('description')->nullable();
        $table->longText('relative_path');

我设置的多对多关系的数据透视表就像这样

        Schema::create('document_plate', function (Blueprint $table) {
      $table->integer('plate_id')->unsigned()->index();
      $table->integer('document_id')->unsigned()->index();

      $table->primary(['plate_id', 'document_id']);

      $table->timestamps();
    });

采取某项行动后,我使用以下代码将plate附加到document

       $plate  =   Plate::find(1);
       $doc    =   Document::find(1);
       if($plate && $doc) {
          $plate->documents()->attach($doc->id);
       }

第一次,一切正常! document_plate得到更新。当具有相同的ids再次执行时,会发生错误。

  

SQLSTATE [23000]:完整性约束违规:1062密钥“PRIMARY”的重复条目“1-1”(SQL:插入document_platecreated_atdocument_id,{{ 1}},plate_id

现在问题

有没有办法避免出错,只需用相同的updated_at更新表格?

或者..我需要在前端设置某种验证,告诉用户(在提交之前)他/她选择已经在表中的相同ids

注意:我正在使用AngularJS进行前端操作。

1 个答案:

答案 0 :(得分:7)

Laravel使用sync方法实现这一目标非常简单。默认情况下,sync方法将分离您未传递给它的任何ID,但它接受可以禁用分离的第二个参数。

$plate->documents()->sync([$doc->id], false);

如果表中尚不存在该条目,则只会添加该条目。

API的链接:http://laravel.com/api/5.1/Illuminate/Database/Eloquent/Relations/BelongsToMany.html#method_sync