php laravel 连接查询,laravel 关联查询问题

1.两个表,customers和contacts表

customers 客户表 有 id name address 字段

contacts 联系人表 有 id name tel qq customer_id字段

一个客户有多个联系人

2.模糊搜索天降联系人tel,列出customers表,如果用join方法会有重复的结果,laravel关联查询orm不能像tp的关联模型一样在customers结果中多一个contact数组存放符合的contacts吗?还要考虑到分页。。

更新

抱歉回复迟了,谢谢几个朋友的更新,晚上花时间使用了下面朋友的方法,首先试了下@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类吧

相关文章:

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值