Laravel 5 ManyToMany

时间:2015-04-30 13:15:59

标签: 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 ($e-> getCode() == 23000) {
        $tag = Tag::firstOrCreate(['title' => $v]);
        $client->tags()->attach($tag->id);
      } else {
        throw $e;
      }
    }
  }
}

我发现使用$client->tags()->create();时如果标签已经存在会导致重复键错误(我为标题设置了一个唯一的键),所以我必须抓住异常并使用另一种方法来关联客户和标签。

虽然我的确有效,但我觉得必须有一种更优雅的方式才能做到这一点,但我们无法通过Google-fu找到解决方案。

1 个答案:

答案 0 :(得分:1)

编辑: 我之前的回应是针对HasMany的。我很抱歉。这是我的正确回答:

只需重新排序您正在执行的操作并使用firstOrNew方法。首先或新手不会创建,因此在模型保存之前不会分配ID。然后,您可以测试ID以了解是否需要保存关联。像这样:

$tag = Tag::firstOrNew(['title' => $v]);
if(!$tag->id){
    $tag->save();
    $client->tags()->attach($tag->id);
}