laravel 通过标签获取相关帖子
laravel get related posts by tags
我想通过标签获取当前 post 的相关 post,但老实说我无法获取。
我将向您展示我的 table 结构。
Posts Table:
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('title');
$table->string('slug')->unique();
$table->text('body');
$table->text('excerpt')->nullable();
$table->string('stickers')->nullable();
$table->integer('category_id')->nullable()->unsigned();
$table->text('meta_description')->nullable();
$table->text('meta_keywords')->nullable();
$table->string('postimg')->nullable();
$table->string('type')->nullable()->default('common');
$table->boolean('published')->default(false);
$table->softDeletes();
$table->timestamps();
});
}
标签Table:
public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->unique();
$table->string('slug')->unique();
$table->softDeletes();
$table->timestamps();
});
}
我有一个枢轴 table 来处理 post 和 post 上带有这些标签的标签。
post_tag table:
public function up()
{
Schema::create('post_tag', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id')->unsigned();
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
$table->integer('tag_id')->unsigned();
$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
});
}
一切正常,一个标签有很多 post,一个 post 有很多标签,是多对多关系。
Post 型号:
public function tags()
{
return $this->belongsToMany('App\Tag');
}
标签模型:
public function posts()
{
return $this->belongsToMany('App\Post');
}
我可以在 post 上显示所有标签,但我想按标签显示相关的 post,当我说相关的 post 时,我的意思是 [=46= 】 那个访客正在阅读。假设当前 post 有一个 microsoft、google、apple、cars 标签,我想要这些标签的相关 post。我不知道按类别分类是否可行或更容易。
新闻控制器逻辑:
这里是 post 视图的所有逻辑。
public function getSingle($slug, $id = null)
{
$post = Post::where('slug', '=', $slug)->first();
$topcat = Category::orderBy('created_at', 'desc')->limit(5)->get();
$comment = Comment::find($id);
$tags = Tag::all();
$tags2 = array();
foreach ($tags as $tag) {
$tags2[$tag->id] = $tag->name;
}
// Previous and Next Post
$previous = Post::where('id', '<', $post->id)->orderBy('id', 'desc')->first();
$next = Post::where('id', '>', $post->id)->orderBy('id', 'asc')->first();
// Related Posts Here!
$tags3 = array();
foreach ($post->tags as $tag) {
$tags3[$tag->id] = $tag->name;
}
$related = Post::whereHas('tags', function ($query) use ($tags3) {
$query->where('name', $tags3);
})->get();
// dd($related);
return view('news.single')
->withPost($post)
->withTopcat($topcat)
->withTags($tags2)
->withComment($comment)
->withPrevious($previous)
->withNext($next)
->withRelated($related);
}
我用 $tags3
变量来测试它,但我没有得到我想要的。
提前致谢
这应该有效:
$post = Post::where('slug', '=', $slug)->first();
$related = Post::whereHas('tags', function ($q) use ($post) {
return $q->whereIn('name', $post->tags->pluck('name'));
})
->where('id', '!=', $post->id) // So you won't fetch same post
->get();
$post->tags->pluck('name')
行创建了一个包含所有标签名称(属于 post)的数组。
我想通过标签获取当前 post 的相关 post,但老实说我无法获取。
我将向您展示我的 table 结构。
Posts Table:
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('title');
$table->string('slug')->unique();
$table->text('body');
$table->text('excerpt')->nullable();
$table->string('stickers')->nullable();
$table->integer('category_id')->nullable()->unsigned();
$table->text('meta_description')->nullable();
$table->text('meta_keywords')->nullable();
$table->string('postimg')->nullable();
$table->string('type')->nullable()->default('common');
$table->boolean('published')->default(false);
$table->softDeletes();
$table->timestamps();
});
}
标签Table:
public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->unique();
$table->string('slug')->unique();
$table->softDeletes();
$table->timestamps();
});
}
我有一个枢轴 table 来处理 post 和 post 上带有这些标签的标签。
post_tag table:
public function up()
{
Schema::create('post_tag', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id')->unsigned();
$table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
$table->integer('tag_id')->unsigned();
$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
});
}
一切正常,一个标签有很多 post,一个 post 有很多标签,是多对多关系。
Post 型号:
public function tags()
{
return $this->belongsToMany('App\Tag');
}
标签模型:
public function posts()
{
return $this->belongsToMany('App\Post');
}
我可以在 post 上显示所有标签,但我想按标签显示相关的 post,当我说相关的 post 时,我的意思是 [=46= 】 那个访客正在阅读。假设当前 post 有一个 microsoft、google、apple、cars 标签,我想要这些标签的相关 post。我不知道按类别分类是否可行或更容易。
新闻控制器逻辑:
这里是 post 视图的所有逻辑。
public function getSingle($slug, $id = null)
{
$post = Post::where('slug', '=', $slug)->first();
$topcat = Category::orderBy('created_at', 'desc')->limit(5)->get();
$comment = Comment::find($id);
$tags = Tag::all();
$tags2 = array();
foreach ($tags as $tag) {
$tags2[$tag->id] = $tag->name;
}
// Previous and Next Post
$previous = Post::where('id', '<', $post->id)->orderBy('id', 'desc')->first();
$next = Post::where('id', '>', $post->id)->orderBy('id', 'asc')->first();
// Related Posts Here!
$tags3 = array();
foreach ($post->tags as $tag) {
$tags3[$tag->id] = $tag->name;
}
$related = Post::whereHas('tags', function ($query) use ($tags3) {
$query->where('name', $tags3);
})->get();
// dd($related);
return view('news.single')
->withPost($post)
->withTopcat($topcat)
->withTags($tags2)
->withComment($comment)
->withPrevious($previous)
->withNext($next)
->withRelated($related);
}
我用 $tags3
变量来测试它,但我没有得到我想要的。
提前致谢
这应该有效:
$post = Post::where('slug', '=', $slug)->first();
$related = Post::whereHas('tags', function ($q) use ($post) {
return $q->whereIn('name', $post->tags->pluck('name'));
})
->where('id', '!=', $post->id) // So you won't fetch same post
->get();
$post->tags->pluck('name')
行创建了一个包含所有标签名称(属于 post)的数组。