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

Php Laravel模型:如何使用自定义数组键获取所有关系作为数组?,php,laravel,laravel-5,eloquent,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...*/]

我有两张桌子:国家和城市。每个都包含列: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..
]
我想,我可以通过属性访问器来实现。但是,如果将来在表中添加了一个新列,例如带有“key”字段,该怎么办?这违反了访问器的逻辑

还有第二个问题:如何使用自定义数组键获取所有模型关系


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

您可以为
City
模型创建
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和名称覆盖。

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

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和名称覆盖。

我已经通过属性访问器完成了这项操作

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


presenter只是一个类,它通过转换和/或格式化数据的方法固定在模型对象上。

我已经通过属性访问器完成了这项工作

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


presenter只是一个类,它通过变换和/或格式化数据的方法固定在模型对象上。

是的,但如果这样做,我就失去了使用原始键名获取数据的机会。是否可以为每个模型(使用相同的代码)调用toMyArray()函数但如何让他们在准备所有关系的过程中一起工作呢?@Stanislav,正如我所说的,你对此无能为力。若你们想分配一些东西给钥匙,你们想保留原来的钥匙,这显然是不可能的,我明白。但是可能会创建自己的模型函数,在所有关系的请求下调用它$model->getMyArrya()-它确实适用于单个模型,但在请求所有关系时不起作用。这可能是解决方案。是的,但如果我这样做,我就失去了获取具有原始密钥名称的数据的机会。是否可以为每个模型(使用相同的代码)调用toMyArray()函数但如何让他们在准备所有关系的过程中一起工作呢?@Stanislav,正如我所说的,你对此无能为力。若你们想分配一些东西给钥匙,你们想保留原来的钥匙,这显然是不可能的,我明白。但是可能会创建自己的模型函数,在所有关系的请求下调用它$model->getMyArrya()-它确实适用于单个模型,但在请求所有关系时不起作用。这可能是解决方案。好主意,但当我们得到模型及其所有关系时,现在不会调用演示者:Country::with('cities')->get();我试图理解为什么会是这样。我不确定我是否理解你的要求。您将不得不在某个时刻转换数据。因为它听起来像是在构建一个API分形,所以可能值得一看,它也处理嵌入的关系。好主意,但当我们获取模型及其所有关系时,此时不会调用Presenter:Country::with('cities')->get();我试图理解为什么会是这样。我不确定我是否理解你的要求。您将不得不在某个时刻转换数据。因为它听起来像是在构建一个API分形,所以可能值得一看,它还处理嵌入的关系。