Php 拉雷维尔5万多
我建立了多对多关系,以便可以标记客户机。存储客户端时,我还使用以下方法将标记与它们关联:Php 拉雷维尔5万多,php,laravel,Php,Laravel,我建立了多对多关系,以便可以标记客户机。存储客户端时,我还使用以下方法将标记与它们关联: foreach($tags as $v) { if (!empty($v)) { try { $client->tags()->create(['title' => $v]); } catch (QueryException $e) { // doesn't work for already existing tags :( if (
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()时如果标记已经存在(我为title设置了一个唯一的键),那么code>会导致重复键错误,因此我必须捕获异常并使用另一种方法来关联客户机和标记
虽然我所拥有的确实有效,但我觉得必须有一种更优雅的方式来实现这一点,但我的Google fu无法找到解决方案。编辑:
我先前的回答是对哈斯曼的。我道歉。以下是我的正确回答:
只需重新排序您正在做的事情,然后使用firstOrNew
方法。First或new不会创建,因此在保存模型之前不会分配ID。然后,您可以测试ID,以了解是否需要保存关联。大概是这样的:
$tag = Tag::firstOrNew(['title' => $v]);
if(!$tag->id){
$tag->save();
$client->tags()->attach($tag->id);
}
我明白,这似乎不管用;“where子句”中的未知列“client_id”已更新我的答案。我为这个错误道歉。