Laravel复杂内部联接的多对多关系

时间:2015-09-16 16:54:20

标签: php mysql laravel-5 eloquent

客户属于3种不同的东西:rate_schedule_idelectricity_code_id和' territory_code_id'。电力代码和地区代码决定了他们使用的baseline。费率表会影响适用于这些基准的费率。

我有以下表格:

 1. customers
    - rate_schedule_id
    - territory_id
    - electricity_code_id

 2. rate_schedules
    - id

 3. utility_rates
    - id
    - rate_schedule_id

 4. baselines
    - id
    - electricity_code_id
    - territory_code_id
    - value
    - rank

 5. utility_rates_baselines
    - id
    - utility_rate_id
    - baseline_id

表5定义了utility_rates和baselines之间的多对多关系。我想要做的查询是:

Get all baselines that apply given the electricity code, territory code, and rate_schedule sorted by rank.

mysql中的这个查询是什么:

SELECT *
FROM base_lines
INNER JOIN utility_rates_base_lines
ON base_lines.id = utility_rates_base_lines.base_line_id
INNER JOIN utility_rates
ON utility_rates.id = utility_rates_base_lines.utility_rate_id
WHERE base_lines.electricity_code_id = 1 
AND base_lines.territory_code_id = 1 AND utility_rates.rate_schedule_id = 1
ORDER BY base_line.rank;`

我可以使用我写的范围获得给定电力代码和地区代码的所有基线:

BaseLine::ofElectricityCodeId(5)->ofTerritoryCode(3);

但是我得到了适用于不同rate_schedule费率的所有基线。

我还可以获得给定费率表的所有效用率,例如:

UtilityRate::ofRateSchedule(2);

然后我可以迭代每个并获得给定的rate_schedule和电力代码的基线。

我也对新的数据库设计持开放态度。如何完成我的查询?

1 个答案:

答案 0 :(得分:2)

正如@PedroMoreira所说,我能够使用查询构建器构建查询。我花了太多时间试图找到一个动态属性来做到这一点,但这是最好的解决方案:

DB::table('base_lines')
        ->join('utility_rates_base_lines', 'base_lines.id', '=', 'utility_rates_base_lines.base_line_id')
        ->join('utility_rates', 'utility_rates.id', '=', 'utility_rates_base_lines.utility_rate_id')
        ->where('base_lines.electricity_code_id', '=', $electricityCodeId)
        ->where('base_lines.territory_code_id', '=', $territoryCodeId)
        ->where('utility_rates.rate_schedule_id', '=', $rateScheduleId)
        ->select('base_lines.*')->get();