laravel 關聯查詢問題

來源:互聯網
上載者:User
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 '&nbsp;&nbsp;';                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 關聯查詢文章和文章作者

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.