在主题标签中创建关系

时间:2019-07-31 07:59:11

标签: laravel relationship hashcode

我想创建一个主题标签系统。目前,我有以下代码:

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创建的数组,则会显示错误:

  

“调用未定义的方法App \ Post :: hashtags()”。

我的问题是:如何在此示例中使用attach,以及如何改进代码。看起来不太好。

1 个答案:

答案 0 :(得分:0)

首先,您的关系应为public方法。

第二,两个关系都应为belongsToMany

发布课程

public function hashtags()
{
    return $this->belongsToMany(Hashtag::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]
);