Laravel模型:如何使用自定义数组键将所有关系作为数组?

时间:2016-12-20 18:16:36

标签: php laravel laravel-5 eloquent

我有两张桌子:国家和城市。它们中的每一个都包含列:id,name等。我可以将所有城市的所有国家作为数组:

$countries = Country::with('cities')->select('id', 'name')->get();
$countries->toArray();

结果:

[
  [
     id: 1
     name: Zimbabe
     cities: [[id: 1, name:'Capital City'], /*etc...*/]           
  ],
//etc.
]

但我需要不同的数组键:'key'和'title'而不是'id'和'name',因为需要一个javascript组件:

[
  [
     key: 1
     title: Zimbabe
     cities: [[key: 1, title:'Capital City'], /*etc...*/]           
  ],
//etc..
]

我想,我可以通过属性访问器来实现。但是,如果将来新的列添加到表中,例如“键”字段,该怎么办?这违反了访问者的逻辑。

还有第二个问题:如何获得与自定义数组键的所有模型关系?

此时我认为唯一的解决方案是在获取所有关系的模型结果后通过递归手动创建一个新数组。

2 个答案:

答案 0 :(得分:0)

您可以为toArray模型创建City方法,以便以如下有效格式获取城市:

public function toArray()
{
   return [
      'key' = $this->id,
      'title' => $this->name,
   ];
}

或者如果您需要更多数据,可以使用:

public function toArray()
{
   $data = parent::toArray();
   $data['key'] = $data['id'];
   unset($data['id']);
   $data['title'] = $data['name'];
   unset($data['name']);
   return $data;
}

它应该做的伎俩。但很明显,当关键字或标题被添加到表格中并且您想要返回它们时,您也无法做任何事情,因为它们将被您分配给这些键的ID和名称覆盖。

答案 1 :(得分:0)

我已经通过属性Accessors完成了它。

不确定这会全部或部分回答您的问题,但这是一种思考方法。最近我一直在使用Presenter模式。

laracasts/Presenter

演示者只是一个使用转换和/或格式化数据的方法固定到模型对象上的类。