laravel10数据库多条件联合查询

 $query = $this->user;
        //定义可能要勾选的字段
         if (isset($data['unit_type']) && !empty($data['unit_type'])) {
            $query = $query->where('unit_type', $data['unit_type']);
         }

         if (isset($data['state']) && !empty($data['state'])) {
            $query = $query->where('state', $data['state']);
         }

        if (isset($data['login_at']) && !empty($data['login_at'])) {
            $query = $query->where('login_at', $data['login_at']);
         }

         if (isset($data['inputContent1']) && !empty($data['inputContent1'])) {
            $query = $query->where('accountname', 'like', "%{$data['inputContent1']}%")
                    ->orWhere('unit', 'like', "%{$data['inputContent1']}%");
         }

         if (isset($data['inputContent2']) && !empty($data['inputContent2'])) {
            $query = $query->where('username', 'like', "%{$data['inputContent2']}%")
                  ->orWhere('phone', 'like', "%{$data['inputContent2']}%");
        }
        //$query = $query1->union($query2);
        $query = $query->get();

        if(!$query->isEmpty())
        {
            return $query;
        }

        throw new Exception("未找到该用户",400);

想要实现多条件联合查询,不知道是不是laravel10的原因,链式查询语句不能分开写,这段代码只能查询其中的某个字段或者某个模糊查询,否则返回结果为空。还望各位大佬指点

编辑:

file 感谢老哥指点,但是问题还是依旧,我查询单个字段时能够用 get 获得正确的查询结果,但是查询两个以上字段时用 get 只能查询到空。用 union () 方法可以实现查询两个以上字段时用 get 返回正确结果,但是不确定是否会对某个字段进行查询,逻辑上不太好写
破案了,自己逻辑错了都用Orwhere结果就对了:mask:,感谢各位老哥指点

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

最好附上请求参数和最终生成的 SQL 语句,这样好排查问题!

感觉应该是你最后两个条件有问题,试试吧最后两个条件写在 where callback 里:

$query->where(function($builder) use ($data) {
    $builder->where('xxx', 'like', '%xxxx%')->orWhere('xxx', 'like', '%xxx%');
});
9个月前 评论
讨论数量: 9

我认为不是 lar10 问题,你用法也没问题。

可以通过检查sql找问题, 然后拿去数据库管理工具执行。

 $query = $query1->union($query2);
//    $query = $query->get();
 $query->dd(); // 查看sql
9个月前 评论

最好附上请求参数和最终生成的 SQL 语句,这样好排查问题!

感觉应该是你最后两个条件有问题,试试吧最后两个条件写在 where callback 里:

$query->where(function($builder) use ($data) {
    $builder->where('xxx', 'like', '%xxxx%')->orWhere('xxx', 'like', '%xxx%');
});
9个月前 评论
  1. 把所有的条件都带上,然后把生成的 SQL 打印出来,看看是不是预期一致;
  2. 如楼上所说,最后两个条件写的有问题,最后两个应该在 where 闭包里用 orWhere,而不是和外层平级,调整下试试。
9个月前 评论

file 感谢老哥指点,但是问题还是依旧,我查询单个字段时能够用get获得正确的查询结果,但是查询两个以上字段时用get只能查询到空。用union()方法可以实现查询两个以上字段时用get返回正确结果,但是不确定是否会对某个字段进行查询,逻辑上不太好写

9个月前 评论
GeorgeKing 9个月前
Disenchant (作者) (楼主) 9个月前
陈先生

如果你需要 where & orwhere 在一个场景内,应使用闭包来完成


$query->where(function ($query) use ($data) {
    $query->where([])
        ->orwhere([]);
});
9个月前 评论

把每个if语句里面的$query=干掉。

$query = MODEL::query();
$query = $query->where('login_at', $data['login_at']);

改成

$query = MODEL::query();
$query->where('login_at', $data['login_at']);

$query = xxx;把原语句替换了。
再打印一下语句看看。

6个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!