在主题标签中创建关系
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]
);
我想创建一个标签系统。目前我有这个代码:
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]
);