欢迎您访问我的笔记本站旨在于记录一些平时工作中遇到的一些问题和解决方法,方便查阅,部分内容来源于网络,如有侵权请联系我删除
  • 微信微信
您现在的位置是:首页 > PHP后端

关于thinkphp 模型关联hasWhere只能用一次问题-[原创]

日期:2023-09-10 16:50:00 作者:tanyi 来源:我的笔记 浏览:805 次
很多时候我们在使用模型关联查询时,需要对关联的模型进行一些搜索或者排除等需求,于是我们需要使用hasWhere对关联模型进行一些限制来查询我们需要的数据,但是thinkphp的hasWhere方法在多次使用后,会发现只有最后一次是执行成功的,而laravel类似功能的方法whereHas则不存在这样的问题,但是也有一些缺点,总之laravel和tp各有各的便利之处。

三张表,user表,user_good表,user_book表,user与其他表一对多,一对一都可以

现在需求是模型关联查询时需要对user_good表,user_book表的一些字段进行模糊搜索,先看laravel处理类似需求的写法大概是这样

$data = User::whereHas('getBook',function ($query){
     $query->where('book_name','like','%测试%');
 })->whereHas('getGood',function ($query){
     $query->where('goods_name','like','%测试%');
 })->get();
 但是这样查询出来主数据只有user表的字段,我想要在数据集中加入book和good表的字段,不是很方便

这是thinkphp写法,按照官方文档应该是这样

$data = User::hasWhere('getBook',function ($query){
     $query->where('book_name','like','%测试%');
 })->hasWhere('getGood',function ($query){
     $query->where('goods_name','like','%测试%');
 })->select();
 这种写法只有对good表筛选生效,前面的book表无效

下面是改进版

$data = User::hasWhere('getBook')
    ->hasWhere('getGood')
    ->where(function ($query){
        $query->where([
            ['UserBook.book_name','like','%人%'],
            ['UserGood.goods_name','like','%人%'],
        ]);
    })->field('`UserBook`.book_name,UserGood.goods_name')->select();
    通过field方法在主数据中追加book和good表的字段


提交评论
评论列表