2015-05-29 62 views
5

我使用eloqent篩選一組的產品:多凡在

Product::whereIn('color', $color)->whereIn('size', $size)->whereIn('price', $price)->get(); 

上述每個變量是IDS

$color = [1,2,4,5] 

我的問題是數組,這是低效的時用戶無法通過一組變量發送信息,比如他們不想要任何彩色濾光片,因此陣列可能是:

$color = []; 

我試過 - > toSql和它生成的sql語句:

select * from `products` where `color` in (?, ?) and 0 = 1 and `price` in (?, ?, ?, ?, ?) 

在上面沒有發送大小過濾器。

0 = 1是什麼意思?這是處理事情的低效方式嗎?

回答

4

這是一個非常有趣的問題。

0 = 1將始終爲假,因此您的查詢將返回零行。但爲什麼呢?

因爲通過設置

->whereIn('size', $size) 

Laravel假定你總是希望返回的行與傳遞的數組的大小之一。如果你沒有在數組中傳遞任何值,Laravel不能做到這一點where size IN(),因爲它會是語法錯誤(你基本上說給我所有匹配這個大小的行,但你沒有傳遞大小)。所以如果數組是空的,它只會放0 = 1

爲了告訴Laravel,如果沒有大小通過,不添加條件的大小隻是在這之前做一個簡單的檢查。這個行爲是hotfix。在之前的Laravel版本中,如果您傳遞空數組,則只會出現語法錯誤引發的異常。現在它只處理1 = 0

+1

謝謝。所以我應該做一些像$ query = Product :: all();然後做一個檢查每個過濾器,如果不是空的$ query-> whereIn('myfilter',$ requestedFilter);這不會做多個查詢,而且效率低下? – panthro

+1

@panthro no,'Product :: all()'會一次提取所有產品。你應該這樣做:'$ product = new Product;'然後檢查並添加條件。 – shaddy

+0

所以它會像$ product = new Product; //檢查過濾器; $產品 - > get()方法; – panthro