我设置了多对多的关系,以便可以标记客户端。当我存储客户端时,我还使用以下方式将标记与它们相关联:
foreach($tags as $v) {
if (!empty($v)) {
try {
$client->tags()->create(['title' => $v]);
} catch (QueryException $e) {
// doesn't work for already existing tags :(
if ($e-> getCode() == 23000) {
$tag = Tag::firstOrCreate(['title' => $v]);
$client->tags()->attach($tag->id);
} else {
throw $e;
}
}
}
}
我发现使用$client->tags()->create();
时如果标签已经存在会导致重复键错误(我为标题设置了一个唯一的键),所以我必须抓住异常并使用另一种方法来关联客户和标签。
虽然我的确有效,但我觉得必须有一种更优雅的方式才能做到这一点,但我们无法通过Google-fu找到解决方案。
答案 0 :(得分:1)
编辑: 我之前的回应是针对HasMany的。我很抱歉。这是我的正确回答:
只需重新排序您正在执行的操作并使用firstOrNew
方法。首先或新手不会创建,因此在模型保存之前不会分配ID。然后,您可以测试ID以了解是否需要保存关联。像这样:
$tag = Tag::firstOrNew(['title' => $v]);
if(!$tag->id){
$tag->save();
$client->tags()->attach($tag->id);
}