Laravel 返回自定义格式的雄辩关系
我有两张桌子:Laravel 返回自定义格式的雄辩关系,laravel,eloquent,relation,custom-formatting,Laravel,Eloquent,Relation,Custom Formatting,我有两张桌子: Services id | name | ... Prices id | service_id | day | time | price 一项服务可以有多种价格(以周为单位,以时间为单位) 当我尝试获取对象并将其转换为数组时,它现在的外观如下: $service = Service::with('prices')->find(1); array 'id' => string '1' 'name' => string 'Test' 'pric
Services
id | name | ...
Prices
id | service_id | day | time | price
一项服务可以有多种价格(以周为单位,以时间为单位)
当我尝试获取对象并将其转换为数组时,它现在的外观如下:
$service = Service::with('prices')->find(1);
array
'id' => string '1'
'name' => string 'Test'
'prices' =>
array
0 =>
array (size=7)
'id' => string '1'
'service_id' => string '1'
'day' => string '1'
'time' => string '0'
'price' => string '50.00'
1 =>
array (size=7)
'id' => string '2'
'service_id' => string '1'
'day' => string '1'
'time' => string '1'
'price' => string '50.00'
...
我希望此服务对象的外观如下所示:
array
'id' => string '1'
'name' => string 'Test'
'prices' =>
array
1 => array
'0' => '100.00'
'1' => '100.00'
...
'23' => '450.00'
2 => array
'0' => '100.00'
'1' => '100.00'
...
'23' => '450.00'
换句话说,我希望我的关系返回第一个包含天(1-7)的数组,并且每一天都是包含当天时间(0-23)的数组
这样做的最佳实践是什么?我会有一个单独的助手类来修改数据。假设您的价格模型称为价格:
class ModelFormatter {
private $pc;
public function __construct(Collection $pricesCollection){
$this->pc = $pricesCollection;
}
public function toArray(){
$result = [];
foreach($this->pc as $item){
//do checks and build up the $result array
}
return $result;
}
}
然后
$service = Service::with('prices')->find(1);
$prices = $service->prices;
(新的ModelFormatter($prices))->toArray()代码>将该任务用于数据库不是更好吗?使用查询范围之类的内容。。使用这种方法,我的控制器将更干净,所有的工作都将在db上进行。查询范围用于指定……嗯,查询的范围。你要做的是用另一种方式建立关系。因此,另一种选择是创建一个单独的关系“pricesToArray”,并以某种方式修改该关系,使其以这种格式返回数据。这里可以看到一个修改关系的示例:是否有方法将此新格式存储回原始对象$service。类似于$service->prices=(新的ModelFormatter($service->prices))->toArray()的东西;当我试图将该对象传递给javascript或var_dump时,我看到on prices属性是数据库中的原始关系