客户属于3种不同的东西:rate_schedule_id
,electricity_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和电力代码的基线。
我也对新的数据库设计持开放态度。如何完成我的查询?
答案 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();