首页 >后端开发 >php教程 >laravel 关联查询问题

laravel 关联查询问题

PHP中文网
PHP中文网原创
2017-03-21 16:18:302623浏览

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 &#39;<br>&#39;;
        }

打印结果如下

sql代码如下

select * from `customers` where `customers`.`deleted_at` is null
select * from `contacts` where `contacts`.`deleted_at` is null and `contacts`.`customer_id` in (&#39;37&#39;, &#39;38&#39;, &#39;39&#39;, &#39;40&#39;, &#39;41&#39;) and `tel` like &#39;%8%&#39;

可以看出不需要的客户1,2,3被查询了出来只是过滤了下符合条件的联系人。

然后来看@dawniii 的方法

       $list = Customer::whereHas(&#39;Contacts&#39;, function ($query) use ($request) {
            if ($request->has(&#39;tel&#39;)) {
                $query->where(&#39;tel&#39;, &#39;like&#39;, &#39;%&#39; . $request->input(&#39;tel&#39;) . &#39;%&#39;);
            }
        })->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 &#39;%8%&#39; and `contacts`.`deleted_at` is null) >= 1
select * from `contacts` where `contacts`.`deleted_at` is null and `contacts`.`customer_id` = &#39;40&#39; and `contacts`.`customer_id` is not null
select * from `contacts` where `contacts`.`deleted_at` is null and `contacts`.`customer_id` = &#39;41&#39; and `contacts`.`customer_id` is not null

如果我的描述有问题,让大家回答有偏移,说声抱歉,
这次问题让我对laravel的orm有了很多理解,如果有什么错误,请大家指正,抛砖引玉,laravel相关的orm实战内容太少,谢谢大家热情回答。

你如果想要Customers的不重复的列表

$list = Customers::whereHas(&#39;Contacts&#39;, function($q)
{
    $q->where(&#39;tel&#39;, &#39;like&#39;, &#39;%foo%&#39;);
})->get();

多看看手册吧

$list =Contacts::with([&#39;Customers&#39;, function ($q) {
    // sub query
  }])->get()

没记错的话,应该是这样

暂时没想到比较好的办法 用一个笨办法解决了
先查出符合条件的contacts表的customer_id,distinct()去重,然后customers表whereIn()得出的customer_id

ORM並不是要取代SQL,一些較複雜的query可能還是需要直接下SQL,只是ORM讓我們有更多的武器,如單純的新增 修改 刪除就非常適合使用ORM的方式。

ORM不适合复杂的对应关系,用回db类吧

相关文章:

关于Laravel多个条件的关联查询问题 ?

Laravel 关联查询只获取管理对象的部分数据

laravel 关联查询文章和文章作者

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn