很多时候我们在使用模型关联查询时,需要对关联的模型进行一些搜索或者排除等需求,于是我们需要使用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表的字段