在我的 Laravel 應用程式中,我希望有一個關系有條件地從兩個表之一加載資料,具體取決于指定的引數。
我有兩個具有相同列的資料透視表,稱為driver_route和driver_route_history。它們都關聯driver_id和route_id列。唯一的區別是driver_route_history有一date列包含一個絕對的時間日期(例如 06/08/2022),而driver_route有一weekday串列示當前周。
driver_route用戶可以修改其中的記錄。在每周結束時,它們被克隆到driver_route_history,因此每周的變化都會被保留下來。
我希望能夠提取一天的資料。如果指定日期在當前周內或參考未來日期,則應從 加載資料driver_route。如果日期早于本周開始,則應從 中提取資料driver_route_history。
我有一個可以做到這一點的函式,當通常從應用程式內的某個地方作為函式呼叫時:
public function driversOnDay($date)
{
$carbon_date = Carbon::parse($date);
if ($carbon_date->isBefore(Carbon::today()->startOfWeek())) {
return $this->belongsToMany(Driver::class, 'driver_route_history')->wherePivot('date', $carbon_date);
} else {
return $this->belongsToMany(Driver::class, 'driver_route')->wherePivot('weekday', strtolower($carbon_date->shortDayName));
}
}
我想使用 Laravel 的熱切加載在每個 Route 記錄上加載這個關系,如下所示:
Route::with(['driversOnDay' => function($query) { ... });
如何將driversOnDay date引數包含在這個急切的加載呼叫中?
uj5u.com熱心網友回復:
據我了解,模型Route通過多對多關系與Driver模型相關聯,如果是在本周或將來,則需要通過資料透視表加入關系,如果早于本周開始,則需要通過資料透視表加入關系.driver_route$datedriver_route_history$date
一種方法是在模型上定義兩個獨立的關系,然后使用范圍:
class Route extends Model
{
public function driversOnDay()
{
return $this->belongsToMany(Driver::class, 'driver_route');
}
public function driversOnDayHistory()
{
return $this->belongsToMany(Driver::class, 'driver_route_history');
}
public function scopeWithDrivers($query, $date)
{
$carbon_date = Carbon::parse($date);
return $query
->when(
$carbon_date->isBefore(Carbon::today()->startOfWeek()),
function($query) use($carbon_date){
$query->with([
'driversOnDayHistory' => function($query) use($carbon_date){
$query->wherePivot('weekday', strtolower($carbon_date->shortDayName));
}
]);
},
function($query) use($carbon_date){
$query->with([
'driversOnDay' => function($query) use($carbon_date){
$query->wherePivot('date', $carbon_date);
}
]);
}
);
}
}
然后您可以在任何地方使用Route模型上的本地范圍
$records = Route::query()->withDrivers($date)->get();
因此,如果日期在過去,$records則會driversOnDayHistory急切加載,否則它將driversOnDay急切加載。
更新
有沒有辦法重命名屬性,所以它在兩種情況下都具有相同的名稱?現在,加載的集合根據加載的關系命名不同。
您可以操作生成的集合。假設您總是希望將預先加載的關系作為driversOnDay提供,那么您可以嘗試
$records = Route::query()
->withDrivers($date)
->get()
->map(function($route) {
if($route->relationLoaded('driversOnDayHistory')) {
$drivers = $route->driversOnDayHistory;
$route->unsetRelation('driversOnDayHistory');
$route->setRelation('driversOnDay', $drivers);
}
return $route;
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487863.html
上一篇:登錄表單未發布
