has()方法可以用來查詢是否有關聯關系的一個東西,一般其他的has方法 就是判斷這個里面有沒有值
$packageOrders = Company::has('packages')->get();
dd($packageOrders);
而這句話的has方法意思就不一樣了,他詳細的邏輯是什么呢,怎么關聯,怎么查詢的。首先看一下dd($packageOrders)輸出的東西是什么
可以看到輸出的也是company的元素,總共取到的數據是18個,如果用
$packageOrders = Company::all(); dd($packageOrders);
all()的方法來取,可以看到打印的數據是100多個,那么has方法是用什么東西 去篩選的,導致結果數據只有18個了。
$packageOrders = Company::has('packages')->get();
這句話的詳細意思就是,先去company找和packages關聯的那張表,看他們互相匹配的id是哪些數據,大概意思是這,首先去company模型查找與之對應的
packages方法
那么packages方法是與app\CompanyPackage模型關聯的,他們關聯的ID是company_id,第三個參數表示用自己的ID值 去和companyPackage里的company_id匹配
那么到數據庫的流程就是 先去company表里查找id的值,在到company_packages表中查看company_id的值,有沒有匹配的,取出所有匹配的數據,匹配的數據取出的是company表的,不會帶出
company_packages表的數據,也就是文章開頭顯示的數據了。
那么如果現在company模型里面的packages方法,第二個參數改為package_id的話,查詢情況又會如何呢
那么 $packageOrders = Company::has('packages')->get(); 會到數據庫里查company表里的id 和 company_packages表package_id互相匹配的值 在顯示出來,
篩選就是這么篩選的,所以all()方法100多條數據,而has只有18條互相匹配的數據了