【问题标题】:Hashtags: create only one relationshipHashtags:只创建一种关系
【发布时间】:2020-01-15 03:17:09
【问题描述】:

我有这个代码

  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 个关系。我可以解决它吗?

【问题讨论】:

  • 能否编辑您的问题并添加相关关系的代码?
  • 你不需要从函数中返回任何东西吗?
  • 你没有很好地解释你的问题:p,你想为文章中所有相同的 hashTag 创建一个 hashTag 关系吗?
  • $article-&gt;hashtags-&gt;contains($hash-&gt;id) - 确定包含基于 ID 的作品?我认为contains($this-&gt;hashtagName($arr[$i]))contains('name', $this-&gt;hashtagName($arr[$i])) 可能更有意义。
  • 是的。我想在主题标签和文章之间创建一种关系。例如:我有 3 个标签:#hashtag x2 和 #helloworld。我想建立 2 关系。我没有创建与重复主题标签的关系。我不需要返回值,因为 tis 方法只存储主题标签并创建关系。

标签: php mysql laravel tags relationship


【解决方案1】:

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

为什么

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

【讨论】:

    猜你喜欢
    • 2021-03-12
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2016-08-15
    • 2016-05-21
    相关资源
    最近更新 更多