tp5.1 hasWhere

起因

工作中习惯使用模型关联查询数据,因为模型关联之后返回的数据可以是一对多的数组,使用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();

结束

以上只是对单个关联条件的筛选,如果是多个关联添加呢,例如我的产品及关联了分组又关联了规格,既要根据分组筛选,又要根据规格筛选该怎么办

问题总比方法多啊

要下班了,下次继续

猜你喜欢

转载自www.cnblogs.com/baozi-tudou/p/12810300.html