我有一张行程表。行程属于客户并且有多天。每天都会分配一个包。我希望能够生成一个清单,显示哪些客户被分配到包以及哪些日期。
我与Eloquent挣扎,因为你无法在一对多关系之外进行查询
我想做的是:
return $this->package->where('PackageID, $id)->itineraryDay->itinerary->customer->select('CustomerID', 'Date')
但只能使用查询构建器真正实现它:
return DB::connection($this->connection)
->table('t_package as PA')
->join('t_itinerary_day_map as IDM', 'IDM.PackageID', '=', 'PA.PackageID')
->join('t_itinerary_day as ID', 'IDM.ItineraryDayID', '=', 'ID.ItineraryDayID')
->join('t_itinerary as IT', 'IT.ItineraryID', '=', 'ID.ItineraryID')
->join('t_customer as CC', 'CC.ItineraryID', '=', 'IT.ItineraryID')
->where('PA.PackageID', $id)
->select('CC.CustomerID', 'ID.Date')
->distinct()
->get();
我真的想使用Eloquent,因为我讨厌硬编码表名,我已经为这些模型建立了关系,但是看不到任何方法
答案 0 :(得分:0)
我相信你可以做这样的事情来找到拥有给定ID包的客户:
$packageId = 42;
$customers = $customer->whereHas('packages', function($q) use($packageId){
return $q->where('package_id', $packageId);
})->get();
这对你想要的东西有什么用?
答案 1 :(得分:0)
我必须对你们的关系做一些假设,但这似乎是可行的。
如果一个行程日属于一个行程。一个行程属于一个客户。一个行程日可能有多个套餐。
$packageID = 111;
$itineraryDays = ItineraryDay::with('itinerary.customer')
->whereHas('package', function($q) use($packageID) {
$q->where('PackageID', $packageID);
})
->get();
foreach($itineraryDays as $itineraryDay) {
var_dump($itineraryDay);
var_dump($itineraryDay->itinerary->customer);
}
我不确定我的关系方法命名是否正确,但希望这有效。