我需要一些关于以下方面的建议。
我有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_plate
(created_at
,document_id
,{{ 1}},plate_id
)
现在问题
有没有办法避免出错,只需用相同的updated_at
更新表格?
或者..我需要在前端设置某种验证,告诉用户(在提交之前)他/她选择已经在表中的相同ids
。
注意:我正在使用AngularJS进行前端操作。
答案 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