起因
工作中習慣使用模型關聯查詢數據,因為模型關聯之后返回的數據可以是一對多的數組,使用join鏈表查詢則是返回多條數據,使用模型關聯就少不了對關聯的模型進行查詢
問題及解決
還是上代碼說明
這是一個規格表關聯商品
$sku = ProdSku::with('skuProd')->where([ ['barcode', '=', $barcode], ['prodid', '<>', $prodid] ])->find();
如果要對商品屬性進行篩選
$sku = ProdSku::with('skuProd'=>function($q){ $q->where('status','in',[0,1]); // 對商品狀態進行查找 })->where([ ['barcode', '=', $barcode], ['prodid', '<>', $prodid] ])->find();
其實還有一種寫法 使用hasWhere 需要注意的是 haswhere只有靜態方法 沒有->
$sku = ProdSku::hasWhere('skuProd',['status'=>1]) ->where([ ['barcode', '=', $barcode], ['prodid', '<>', $prodid] ])->fetchSql(true)->find();
但是對比之后,發現使用haswhere 時 如果where部分是數組, 就只能是 等於 操作,例如狀態等於1
但是我想要的狀態是 在某個范圍內,例如 in
就只能使用閉包
$sku = ProdSku::hasWhere('skuProd',function($q){ $q->where('status','in',[1,0]); }) ->where([ ['barcode', '=', $barcode], ['prodid', '<>', $prodid] ])->fetchSql(true)->find();
一看這種寫法沒問題啊,但是還是會報錯,說是status兩個表都有,不知道是查哪一個
經過嘗試之后發現, 需要在status前面加上它所屬的模型名稱
$sku = ProdSku::hasWhere('skuProd',function($q){ $q->where('ProdMain.status','in',[1,0]); }) ->where([ ['barcode', '=', $barcode], ['prodid', '<>', $prodid] ])->find();
結束
以上只是對單個關聯條件的篩選,如果是多個關聯添加呢,例如我的產品及關聯了分組又關聯了規格,既要根據分組篩選,又要根據規格篩選該怎么辦
問題總比方法多啊
要下班了,下次繼續