2016-11-30 44 views
1

我必須在這裏丟失一些明顯的東西。Laravel「orWhere」不按預期工作

假設我有一個searchTerm變量設置爲「%Arrival%」。

我有以下代碼:

$results = $app->screeners()->where('title', 'LIKE', $searchTerm)->get()

$results陣列現在認爲有title 「到達」 一個對象。現在

,如果我運行下面的代碼:

$results = $app->screeners()->where('title', 'LIKE', $searchTerm)->orWhere('description', 'LIKE', $searchTerm)->get();

我得到一個空數組。

有人可以解釋如何添加「或」子句是否刪除結果?

回答

2

默認情況下,Laravel將添加where條件來限制查詢,以僅返回deleted_at屬性爲null的記錄。正在爲您查詢生成的where子句可能類似於這樣的事情:

WHERE `table_name`.`deleted_at` IS NULL AND `title` LIKE ? OR `description` LIKE ? 

我不知道爲什麼這個查詢不會僅限制查詢到title列包括以前的結果,但你可以通過刪除對->get()的調用並添加dd($results->toSql())來查看生成的實際SQL。這可能會幫助您進一步調試。

我覺得你真的想要做的是必須要應用到查詢的兩個條件可以嵌套,沿着這些路線的東西:

WHERE `table_name`.`deleted_at` IS NULL AND (`title` LIKE ? OR `description` LIKE ?) 

您可以通過一個封閉傳遞給where實現這一目標:

$results = $app->screeners()->where(function($query) use($searchTerm) { 
    // Notice also the addition of the placeholder ('%') character 
    $query->where('title', 'LIKE', '%' . $searchTerm . '%') 
     ->orWhere('description', 'LIKE', '%' . $searchTerm . '%') 
    ; 
})->get(); 
+0

那麼,這個新版本肯定有效,但我仍然不明白爲什麼我的工作不起作用。另外我應該提到我的$ searchTerm變量實際上是%Arraival%,只是意外地刪除了一些代碼! – Rail24

+0

@ Rail24我認爲,假設一個查詢獲得預加載的'WHERE'條件已經發揮作用。只需添加另一個「OR」子句就不會像你期望的那樣工作。如果您可以發佈實際生成的SQL,那麼該問題的答案可能會變得更加清晰。 –

+0

這是它吐出的聲明:'select * from「screeners」where「screener_application_ids」=?和(「標題」LIKE?或「描述」LIKE?)' – Rail24