亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Laravel 雄辯:如何用 where() 和 whereHas() 過濾

Laravel 雄辯:如何用 where() 和 whereHas() 過濾

PHP
一只甜甜圈 2021-11-26 15:43:12
我正在嘗試根據他們發布內容的類別以及用戶直接通過搜索字符串過濾我的用戶:$users = User::when($search, function ($query) use ($request) {    $query->where('name', 'like', '%' . $request['search'] . '%')          ->orWhere('email', 'like', '%' . $request['search'] . '%');    return $query;})->when($categories, function ($query) use ($request) {    return $query->whereHas('posts.category', function ($query) use ($request) {        $query->whereIn('name', $request['categories']);    });})->select('id', 'name', 'email')->paginate(10);當我只過濾類別(沒有$search)時,它按預期工作,但只要我輸入搜索字符串,結果就會被搜索字符串過濾,$request['search']但完全忽略類別過濾。例如:名為“Jon”的用戶在“生活方式”類別中有一個帖子。另一個名為“Jonn”的用戶在“體育”類別中有一個帖子?,F在,如果我只過濾“體育”類別,我會得到正確的結果 ->“喬恩”。但是,如果我使用搜索字符串“Jon”進行額外過濾,結果是 ->“Jon”和“Jonn”,這不是預期的結果,因為它應該過濾“Sports”并命名“%Jon%”,因此結果應該再次只是“喬恩”。我不知道我怎么能實現該過濾器組合where()和whereHas()。
查看完整描述

2 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

你可以這樣試試:


$users = User::where(function ($query) {

    $query->when($search, function ($query) use ($request) {

        $query->where('name', 'like', '%' . $request['search'] . '%')

          ->orWhere('address', 'like', '%' . $request['search'] . '%')

          ->orWhere('email', 'like', '%' . $request['search'] . '%');

        })

    $query->when($categories, function ($query) use ($request) {

           $query->whereHas('posts.category', function ($query) use ($request) {

           $query->whereIn('name', $request['categories']);

        });

    })

})

->select('id', 'name', 'email')

->paginate(10);

我認為你不需要你的回報。但是,如果您將when語句放在這樣的一個where函數中,您就可以實現您想要的。


我沒有測試這個解決方案,所以如果你有錯誤,請在評論中提供它。


查看完整回答
反對 回復 2021-11-26
?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

您的問題是約束的嵌套。轉換為 SQL,您的查詢如下所示:


SELECT id, name, email

FROM users

WHERE name like '%foo%'

   OR address like '%foo%'

   OR email like '%foo%'

  AND EXISTS (

    SELECT *

    FROM categories c

      INNER JOIN posts p ON p.category_id = c.id

    WHERE c.name IN ('bar', 'baz')

  )

注意:分頁省略


如您所見,目前還不清楚這些WHERE語句應該做什么。但這可以通過將所有搜索約束包裝在一個額外的內容中來輕松解決where():


$users = User::when($search, function ($query) use ($request) {

    $query->where(function $query) use ($request) {

        $query->where('name', 'like', '%' . $request['search'] . '%')

            ->orWhere('address', 'like', '%' . $request['search'] . '%')

            ->orWhere('email', 'like', '%' . $request['search'] . '%');

    });

})

->when($categories, function ($query) use ($request) {

    $query->whereHas('posts.category', function ($query) use ($request) {

        $query->whereIn('name', $request['categories']);

    });

})

->select('id', 'name', 'email')

->paginate(10);

這樣您的查詢將如下所示:


SELECT id, name, email

FROM users

WHERE

  (

     name like '%foo%'

     OR address like '%foo%'

     OR email like '%foo%'

  )

  AND EXISTS (

    SELECT *

    FROM categories c

      INNER JOIN posts p ON p.category_id = c.id

    WHERE c.name IN ('bar', 'baz')

  )

旁邊的一個小說明:您不必$query從回調中返回。


查看完整回答
反對 回復 2021-11-26
  • 2 回答
  • 0 關注
  • 352 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號