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 '<br>'; }
列印結果如下
sql代碼如下
select * from `customers` where `customers`.`deleted_at` is nullselect * 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) >= 1select * from `contacts` where `contacts`.`deleted_at` is null and `contacts`.`customer_id` = '40' and `contacts`.`customer_id` is not nullselect * 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 關聯查詢文章和文章作者