【问题标题】:Search Where Has搜索哪里有
【发布时间】:2020-02-07 00:11:59
【问题描述】:

所以我有一个帖子表,其中每个帖子都在一个相册中,我想按帖子属性搜索,但还要查看帖子的相册,我该怎么做?

我试过在控制器中使用它

$posts = album::whereHas('post', function($q) use ($search) {
            $q->where('nama', 'like', "%$search%", 'or')->where('deskripsi', 'like', "%$search%");
        })->get();

这是我的刀片视图,先显示专辑,然后显示帖子

@foreach($posts as $p )
.....
    @foreach($p->post->where('nama', 'like', "%$search%", 'or')->where('deskripsi', 'like', "%$search%") as $post)
    ....
    @endforeach
@endforeach

但问题是它给了我所有的专辑,即使是没有帖子的那张。我的英语不是最好的,但我希望你能理解它

【问题讨论】:

    标签: laravel eloquent laravel-6


    【解决方案1】:

    如下更改您的查询:

    $albums = album::whereHas('post', function($q) use ($search) {
                      $q->where('nama', 'like', '%'.$search.'%')
                    })
                    ->orWhereHas('post', function($q) use ($search) {
                      $q->where('deskripsi', 'like', '%'.$search.'%')
                    })
                    ->get();
    

    你认为Chagne:

    @foreach($albums as $album )
    ..... // display here album data
        @foreach($album->post as $post)
        .... // display here post data
        @endforeach
    @endforeach
    

    编辑:

    在您的相册模型中,为帖子定义新关系:

    public function searchedPosts($search = null)
    {
        $posts = $this->hasMany('App\Post'); // your model path
        if($search!=null){
          $posts->where('nama', 'like', '%'.$search.'%')->orWhere('deskripsi', 'like', '%'.$search.'%');
        }
    
        return $posts;
    }
    

    如下更改您的查询:

    $albums = album::with('post)->whereHas('post', function($q) use ($search) {
                      $q->where('nama', 'like', '%'.$search.'%')
                    })
                    ->orWhereHas('post', function($q) use ($search) {
                      $q->where('deskripsi', 'like', '%'.$search.'%')
                    })
                    ->get();
    

    改变你的看法如下:

    @foreach($albums as $album )
    ..... // display here album data
        @foreach($album->searchedPosts($search)->get() as $post)
        .... // display here post data
        @endforeach
    @endforeach
    

    【讨论】:

    • 好的,这是工作,所以我会接受这个,但我如何显示在他们的名称或桌面中只有 $search 的帖子?谢谢
    • 好吧,这是一个改进,但现在它显示在另一个相册中的帖子。例如,在专辑 1 中只有 2 个结果,但它显示了所有结果,即使第三个结果是针对专辑 2,所以专辑 2 也给出了所有 3 个结果,我希望你能理解它,对不起这个菜鸟问题,我只是开始进入 laravel。
    【解决方案2】:

    在你的 Post 模型中添加这个: $with = ['album'];,它假设将相册模型添加到从数据库中检索到的每个帖子中。如果关系方法(在 Post 模型中)的名称与 album 不同,请相应地更改此数组。

    然后就使用这个查询:

    $posts = Post::where('nama', 'like', "%$search%")->orWhere('deskripsi', 'like', "%$search%")
            ->get();
    

    然后像这样迭代:

    @foreach($posts as $p)
        {{ $p->album->title }}
    @endforeach
    

    【讨论】:

      【解决方案3】:
       public function search(Request $request)
          {
              $query = $request->input('query');
              $posts = Post::where('title','LIKE',"%$query%")
                  ->approved()->publish()->get();
              return view('FrontPage.search',compact('posts','query'));
          }
      

      【讨论】:

        猜你喜欢
        • 2014-09-15
        • 1970-01-01
        • 2014-07-11
        • 1970-01-01
        • 1970-01-01
        • 2014-08-27
        • 2014-09-11
        • 2016-09-09
        相关资源
        最近更新 更多