Eloquent中的复杂连接

时间:2014-08-01 12:12:35

标签: php laravel laravel-4 eloquent

我有一张行程表。行程属于客户并且有多天。每天都会分配一个包。我希望能够生成一个清单,显示哪些客户被分配到包以及哪些日期。

我与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,因为我讨厌硬编码表名,我已经为这些模型建立了关系,但是看不到任何方法

2 个答案:

答案 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);
}

我不确定我的关系方法命名是否正确,但希望这有效。