我想创建一个主题标签系统。目前,我有以下代码:
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,以及如何改进代码。看起来不太好。
答案 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]
);