首页 > 解决方案 > Hashtags:只创建一种关系

问题描述

我有这个代码

  private function hashtags($article){
    $htag = '#';
    $arr = explode(" ", $article->description);
    $arrc = count($arr);
    $i = 0;
    $arr_id = [];
    while($i < $arrc){
      if(substr($arr[$i], 0, 1) === $htag ){
        $hash = Hashtag::firstOrCreate(
            ['name' => $this->hashtagName($arr[$i]), 'slug' => str_slug(ltrim($arr[$i], '#'))]
        );

        $article->hashtags()->attach($hash);
      }
      $i++;
    }
  }

hashtagName 是修改主题标签名称的函数,因为我使用 WYSCIWYG 编辑器,有时我在名称列中遇到 html 标签问题。但这并不重要。我尝试解决我的问题,所以我找到了可以使用而不是附加的代码。

  if (! $article->hashtags->contains($hash->id)) {
    $article->hashtags()->save($hash);
  }

但这并不能解决我的问题。如果我存储具有 2 个或更多相同主题标签的文章,它会创建相同数量的关系。如果我在同一篇文章中使用了 3 个主题标签,我将有 3 个关系。呵呵,我能修吗?

标签: phpmysqllaraveltagsrelationship

解决方案


您实施中的问题是您检查 hTag 的 id。

为什么

因为如果您有两个相同的 hTag 并保存第一个,您将获得 ID1,然后您将附加它,直到这里没有问题。但是,当您保存第二个相同的(一开始不应该这样做)时,您将获得 ID2,其中 ID1 与 ID2 不同,因此此检查$article->hashtags->contains($hash->id)行将找不到具有相同名称的 hTag。

一个可能的解决方案:

private function hashtags($article){
    $htag = '#';
    $arr = explode(" ", $article->description);
    $arrc = count($arr);
    $i = 0;
    $arr_id = [];
    while($i < $arrc){
        $hTagName = $this->hashtagName($arr[$i]);

        $exists = Hashtag::whereArticleId($article_id)
                    ->whereName($hTagName)
                    ->exists();

        if(substr($arr[$i], 0, 1) === $htag && !$exists ){
            $hash = Hashtag::firstOrCreate(
                ['name' => $hTagName, 'slug' => str_slug(ltrim($arr[$i], '#'))]
            );

            $article->hashtags()->attach($hash);
        }
        $i++;
    }
}

推荐阅读