【问题标题】:Get all the data with specific tag in laravel获取laravel中带有特定标签的所有数据
【发布时间】:2017-10-23 06:23:18
【问题描述】:

我正在为posttagspost_tags 使用雄辩的关系。我想做的是在我的前端视图中使用特定的tags 制作posts 的部分。就像我有一个1 部分一样,它应该有标签"new" 的所有帖子,2 部分应该有标签"old" 等的所有帖子。我希望所有这些都发生在同一个视图中。

后模型

public function tags()
{
    return $this->belongsToMany('App\Tag', 'post_tag');
}

标签模型

 public function posts()
 {
     return $this->belongsToMany('App\Post', 'post_tag');
 }

控制器

public function index()
{
    $posts = Post::all();
    return view('frontend.index')->withPosts($posts);    
}

请帮帮我:)

【问题讨论】:

  • 你仍然收到错误Undefined variable: tags ??
  • @Maraboc 是的.. 我也更新了我的问题
  • 可以添加查看代码吗??
  • 现在在我看来,我只显示像 foreach ($posts as $post)

    {{ $posts->title }}

    endforeach 这样的帖子。但我不知道如何发布特定标签

标签: php laravel laravel-5 tags laravel-5.3


【解决方案1】:

要获取标签名称为 new 的所有帖子,请执行以下操作:

Post::whereHas('tags', function ($q) {
    $q->where('name', 'new');
})->get();

【讨论】:

  • 我认为先生您没有理解我的问题。我正在尝试获取标签名称为“新”的所有帖子。我认为您的代码将显示一篇文章的所有标签。
  • @HussynNaqvi 感谢您的解释,我已经更新了我的答案。
  • 现在我收到错误“未定义的变量:标签”。其次,在我看来,这段代码是否适用于 foreach 循环?
  • @HussynNaqvi 您说过您只想获取标签名称为“新”的帖子。如果您还想加载标签,请将->with('tags') 添加到查询中,并使用我之前回答中的 foreach 循环。
  • 我在我的问题中说过,在我的前端视图中,我想要标签的不同部分。在那些部分中,我想要特定标签的特定帖子,例如第 1 部分,我希望在另一个部分同时发布标签“新”的所有帖子,我想要标签“旧”等的所有帖子,所有这些都发生在相同的视图中控制器。
【解决方案2】:

您可以通过加载帖子获取所有标签:

public function index()
{
    $tags = Tag::with('posts')->get();
    return view('frontend.index')->withTags($tags);    
}

在视图中你可以这样做:

@foreach ($tags as $tag)
    <h2>Tag : {{ $tag->name }}</h2>
    @foreach ($tag->posts as $post)
        <p>Post : {{ $post->title }}</p>
    @endforeach
@endforeach

用于获取您有标签的帖子:

public function index()
{
    $tagName = 'new';
    $posts = Post::whereHas('tags', function ($q) use($tagName) {
        $q->where('name', $tagName);
    })->get();
    return view('frontend.index')->withTagName($tagName)->withPosts($posts);
}

在视图中你可以这样做:

<h2>Tag : {{ $tagName }}</h2>
@foreach ($posts as $post)
    <p>Post : {{ $post->title }}</p>
@endforeach

如果您想从视图中进行查询,您可以这样做(但这不是上帝的做法,因为视图只是用于查看内容而不是从数据库中获取它):

<?php foreach ((\App\Post::whereHas('tags', function ($q) use($tagName) {
                    $q->where('name', $tagName);
                })->get()) as $post) { ?>

            <p>Post : {{ $post->title }}</p>

<?php } ?>

【讨论】:

  • @Hussyn 是您要找的吗?
  • 不,先生,我正在寻找类似 $posts = Post::with('tags)->where('name', '=', 'new')->get() 的东西;
  • 它有效 :D 谢谢.. :) 但是我们可以将它与 foreach 一起使用吗,因为在 ruby​​ on rails 我可以执行类似 posts.joins(:tags).where('tags.name = ?', 'new').each 都做 |post|它会给我相同的答案,但我不知道如何在 laravel 中做到这一点
  • 我没有得到你想要的,你能解释一下吗?
  • 意味着我们可以在视图端应用它,它仍然得到与 foreach ($posts->whereHas('tags', function ($q) use($tagName) { $q 相同的答案->where('name', $tagName); }) as $post)
【解决方案3】:

解决方案不是完美的答案
您可以通过两种方式处理这种情况

1- send two objects from controller to view seprate one for only new tag and second without new tag

2- 你可以在前端使用条件来处理这种情况

@if($user->tag == "new")
{$user->show}
@endif

【讨论】:

    猜你喜欢
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 2017-01-05
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    相关资源
    最近更新 更多