我正在處理一個較早的專案,我的任務是在我們進行全面重寫的同時加快某些部分的速度,因為代碼的維護很差,寫得很差,而且對于它所要做的事情來說已經過時。
我偶然發現了專案核心的一個問題,正因為如此,我不能在不破壞其他幾乎所有東西的情況下改變它。因此,我需要以雄辯的方式加載一個 "關系"(使用Planning:with('availability')),但是沒有一個真正的外國ID,而是用多個欄位進行連接。
是否有辦法在一個查詢中加載所有的重疊欄位,而不是讓它單獨加載,造成一個n 1的問題?
-------------- -----------------
| 規劃 | 可用性 |
-------------- -----------------
|規劃_ID |可用性_ID |
|日期|日期|日期|
| startHour | startHour |
| 候選人_ID | 候選人_ID | 候選人_ID
| 候選人_ID | 候選人_ID |
|節_ID |節_ID
-------------- -----------------
從上面的例子中,你可以看到重疊的欄位是date, startHour, stopHour, candidate_id 和 section_id。
我嘗試了get...屬性,但是仍然加載了n 1,我嘗試用->with(['availabilities'])包括它,但是這不起作用,因為我要求的是
模型而不是關系:
為了更清晰地編輯:
規劃模型:
public function availability()
{
return Availability::where('section_id', $this-> section_id)
->where('candid', $this-> candidate_id)
->where('planningDate', $this-> planningDate)
->where('startHour', $this->startHour)
->where('stopHour'/span>, $this->stopHour)
->get()。
}
public function availability2()
{
return $this->hasMany('AppModelsAvailability', 'candid_id', 'candid_id')
}
Controller:
$plannings = Planning::with(['availabilities'])-> get();
$plannings = Planning:: with(['availabilities2' => function ($query) /span>{
//$this應該是規劃模型,但并不作業。
$query->where('section_id', $this-> section_id)
->where('planningDate', $this-> planningDate)
->where('startHour', $this->startHour)
->where('stopHour', $this->stopHour) 。
//---- OR ---- //
///這里沒有訪問規劃表的權限。
$query->where('section_id', 'planning.section_id')
->where('planningDate', 'planning.planningDate')
->where('startHour', 'planning.startHour')
->where('stopHour', 'planning.stopHour') 。
}])->get()。
uj5u.com熱心網友回復:
首先,為了能夠加載我的關系,我取了一個匹配的鍵,并取了一個匹配度最低的鍵,在我的例子中是section_id。
因此,在我的規劃模型中,我有一個函式:
public function availabilities()
{
return $this-> hasMany('AppModelsAvailability', 'section_id', 'section_id') 。
}
這樣,我就可以在需要的時候用加載資料。Planning:with('availability')。
然而,由于我有一些其他的鍵需要匹配,我找到了一種方法,通過給它添加一個子查詢來限制這種關系:
。
$planning = Planning::with([
'availabilities' => function ($query) {
$query->where('candid', $this-> candidate_id)
->where('startHour', $this->startHour)
->where('stopHour', $this->stopHour) 。
},
//任何其他關系都可以在這里添加。
])
->get()。
這不是最好的方法,但這是我發現的唯一的方法,它不會得到太多的額外資料,同時也尊重了我的關系
。uj5u.com熱心網友回復:
當你想在where()方法中使用多個欄位時,你最多在where()方法中插入一個陣列。
這個檔案可以幫助你
- 把你的代碼改成這樣:
return Availability::where([
['section_id', $this-> section_id],
['candid', $this->candid] 。
['planningDate', $this-> planningDate],
['startHour', $this->startHour] 。
['stopHour', $this->stopHour] 。
])->firstOrFail()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/320614.html
標籤:
