在主题标签中创建关系

Create relationships in hashtags

我想创建一个标签系统。目前我有这个代码:

private function hashtags($post){
  $htag = '#';
  $arr = explode(" ", $post->description);
  $arrc = count($arr);
  $i = 0;
  while($i < $arrc){
    if(substr($arr[$i], 0, 1) === $htag ){
      $hash = Hashtag::where('name', ltrim($arr[$i], '#'))
                     ->where('slug', str_slug(ltrim($arr[$i], '#')))
                     ->first();
      if(!$hash){
        Hashtag::create([
          'name' => ltrim($arr[$i], '#'),
          'type' => 1,
          'slug' => str_slug(ltrim($arr[$i], '#'))
        ]);
      }

      $current_hash = Hashtag::where('type', 1)
                             ->where('name', ltrim($arr[$i], '#'))
                             ->first();
      \DB::insert('insert into hashtag_post (hashtag_id, post_id) values (' .$current_hash->id. ', ' .$post->id. ')');
    }
    $i++;
  }

}

此代码对我不利,因为我更喜欢使用附加方法,但如果我尝试使用 $post->hashtags()->attach([1, 2, 3]); 或我使用主题标签 ID 创建的其他数组,它会显示错误:

"Call to undefined method App\Post::hashtags()".

我的问题 is:How 我可以在这个例子中使用 attach 以及如何改进我的代码。看起来不太好。

首先,你的关系应该是 public 方法。

其次,两个关系应该是belongsToMany

Post class

public function hashtags()
{
    return $this->belongsToMany(Hashtag::class);
}

标签 class

public function posts()
{
    return $this->belongsToMany(Post::class);
}

仅供参考,Laravel 带有帮助方法,可以减少您必须编写的内容,例如firstOrCreate()。所以,这个:

$hash = Hashtag::where('name', ltrim($arr[$i], '#'))
                     ->where('slug', str_slug(ltrim($arr[$i], '#')))
                     ->first();
if(!$hash){
    Hashtag::create([
      'name' => ltrim($arr[$i], '#'),
      'type' => 1,
      'slug' => str_slug(ltrim($arr[$i], '#'))
    ]);
}

可以变成:

$hash = Hash::firstOrCreate(
    ['name' => ltrim($arr[$i], '#'), 'slug' => str_slug(ltrim($arr[$i], '#'))],
    ['type' => 1]
);