起因
工作中习惯使用模型关联查询数据,因为模型关联之后返回的数据可以是一对多的数组,使用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();
结束
以上只是对单个关联条件的筛选,如果是多个关联添加呢,例如我的产品及关联了分组又关联了规格,既要根据分组筛选,又要根据规格筛选该怎么办
问题总比方法多啊
要下班了,下次继续