更新
抱歉回复迟了,谢谢几个朋友的更新,晚上花时间使用了下面朋友的方法,首先试了下@daniel_wu魏 的方法,laravel手册上的预加载方法。
我需要搜索联系人电话号码中含有号码8的客户,客户4中联系人3和客户5联系人1、联系人2是符合条件的,目标就是查询出这个两个客户
代码如下
$list = Customer::with(['Contacts' => function ($query) use ($request) { if ($request->has('tel')) { $query->where('tel', 'like', '%' . $request->input('tel') . '%'); } }])->get();
然后我打印出$list
打印代码如下
foreach ($list as $data) { echo $data->name; foreach ($data->contacts as $item) { echo ' '; echo $item->name; } echo '
'; }
打印结果如下
sql代码如下
select * from `customers` where `customers`.`deleted_at` is null select * from `contacts` where `contacts`.`deleted_at` is null and `contacts`.`customer_id` in ('37', '38', '39', '40', '41') and `tel` like '%8%'
可以看出不需要的客户1,2,3被查询了出来只是过滤了下符合条件的联系人。
然后来看@dawniii 的方法
$list = Customer::whereHas('Contacts', function ($query) use ($request) { if ($request->has('tel')) { $query->where('tel', 'like', '%' . $request->input('tel') . '%'); } })->get();
得到的结果
sql代码
select * from `customers` where `customers`.`deleted_at` is null and (select count(*) from `contacts` where `contacts`.`customer_id` = `customers`.`id` and `tel` like '%8%' and `contacts`.`deleted_at` is null) >= 1 select * from `contacts` where `contacts`.`deleted_at` is null and `contacts`.`customer_id` = '40' and `contacts`.`customer_id` is not null select * from `contacts` where `contacts`.`deleted_at` is null and `contacts`.`customer_id` = '41' and `contacts`.`customer_id` is not null
如果我的描述有问题,让大家回答有偏移,说声抱歉,
这次问题让我对laravel的orm有了很多理解,如果有什么错误,请大家指正,抛砖引玉,laravel相关的orm实战内容太少,谢谢大家热情回答。
你如果想要Customers的不重复的列表
$list = Customers::whereHas('Contacts', function($q) { $q->where('tel', 'like', '%foo%'); })->get();
多看看手册吧
$list =Contacts::with(['Customers', function ($q) { // sub query }])->get()
没记错的话,应该是这样
暂时没想到比较好的办法 用一个笨办法解决了
先查出符合条件的contacts表的customer_id,distinct()去重,然后customers表whereIn()得出的customer_id
ORM並不是要取代SQL,一些較複雜的query可能還是需要直接下SQL,只是ORM讓我們有更多的武器,如單純的新增 修改 刪除就非常適合使用ORM的方式。
ORM不适合复杂的对应关系,用回db类吧
相关文章:
关于Laravel多个条件的关联查询问题 ?
Laravel 关联查询只获取管理对象的部分数据
laravel 关联查询文章和文章作者