【问题标题】:Remove all tags before store tags在存储标签之前删除所有标签
【发布时间】:2020-01-15 11:34:13
【问题描述】:

我有这个代码

  private function hashtagName($string){
    $name = $string;
    $name = ltrim($name, '#');
    $name = trim($name);
    return $name;
  }
  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], '#'))]
        );

        if (! $article->hashtags->contains('hashtag_id', $this->hashtagName($arr[$i]))) {
          $article->hashtags()->save($hash);
        }
      }
      $i++;
    }
  }

此代码将标签正确存储到数据库中。如果我尝试在 WYSCIWYG 编辑器中使用一些主题标签,我会遇到问题。 WYSCIWYG 编辑器经常添加它自己的 html 标记,并且此代码保存它。例如它存储在 DB helloworld

【问题讨论】:

    标签: php mysql laravel tags relationship


    【解决方案1】:

    由于一个Article 可以有多个hashtags 并且一个hashtag 可以属于多个articles,所以这是一个ManyToMany 关系......

    您可以使用sync 方法同步标签,任何不在新关联数组中的旧标签将被自动删除...

    $article->hashtags()->sync($arrayOfHashtagsIds);
    

    来自Docs

    同步关联

    您也可以使用同步方法来构建多对多关联。 sync 方法接受要放置在中间表上的 ID 数组。任何不在给定数组中的 ID 都将从中间表中删除。所以,这个操作完成后,中间表中只会存在给定数组中的ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-02
      相关资源
      最近更新 更多