【问题标题】:Laravel collection - only() to main array and subarrayLaravel 集合 - only() 到主数组和子数组
【发布时间】:2018-12-15 21:03:58
【问题描述】:

我有集合(来自具有复杂查询的数据库),我试图通过 ->only() 方法只获取它的几个值,但它不起作用。

收藏:

0 => array:4 [
  "id" => 1
  "start_date" => "2018-07-07 14:00:00"
  "end_date" => "2018-07-07 15:00:00"
  "child" => array:5 [
    "id" => 1
    "name" => "Mr. Davin Conroy Sr."
    "email" => "prempel@example.com"
    "created_at" => "2018-07-06 22:28:16"
    "updated_at" => "2018-07-06 22:28:16"
  ]
]
1 => array:4 [
  "id" => 2
  "start_date" => "2018-07-07 15:00:00"
  "end_date" => "2018-07-07 16:00:00"
  "child" => array:5 [
    "id" => 1
    "name" => "Mr. Davin Conroy Sr."
    "email" => "prempel@example.com"
    "created_at" => "2018-07-06 22:28:16"
    "updated_at" => "2018-07-06 22:28:16"
  ]

我的代码:

    $subset = $monitorList->map(function ($monitor) {
        return collect($monitor->toArray())
            ->only(['id', 'start_date', 'end_date', 'child.name', 'child.email'])
            ->all();
    });

但它丢失了 child.name。有什么办法可以解决这个问题?

0 => array:3 [
  "id" => 1
  "start_date" => "2018-07-07 14:00:00"
  "end_date" => "2018-07-07 15:00:00"
]
1 => array:3 [
  "id" => 2
  "start_date" => "2018-07-07 15:00:00"
  "end_date" => "2018-07-07 16:00:00"
]

【问题讨论】:

  • 您已将其转换为数组,它不再是 Model 实例,这就是为什么您不能使用 dot . 来获取值(我猜)。在进行查询时,您肯定已经可以得到该值。

标签: arrays laravel recursion collections


【解决方案1】:

你可以使用

$subset = $monitorList->map(function ($monitor) {
     $data = $monitor->only('id', 'start_date', 'end_date');
     $data['child'] = $monitor->child->only('name', 'email');
     return $data;
});

在您的情况下,最好的做法是只获取需要的数据。

$monitorList = Motor::with('child:id,name,email')
    ->get(['id', 'id_user', 'start_date', 'start_date']);

您也可以在您的情况下使用此代码

$subset = $monitorList->map(function ($monitor) {
     $monitor->child->makeHidden('updated_at', 'created_at', 'id');
     return $monitor;
});

为了获得良好的实践,您可以使用

$monitorList = Motor::with('child:id,name,email')
    ->get(['id', 'id_user', 'start_date', 'start_date']);

$subset = $monitorList->map(function ($monitor) {
     $monitor->child->makeHidden('id');
     return $monitor;
});

【讨论】:

  • 您使用哪种解决方案??
  • 第一个,第二个选项不幸地将“孩子”显示为空。也许是因为我有一个更复杂的查询
  • child null 因为没有选择外键对应关系。你可以用这个更完美的解决方案$monitorList = Motor::with('child:id,name,email') ->get(['id', 'id_user', 'start_date', 'start_date']);
  • 试试就行,不行就改id_user对应键
  • 很好,它起作用了,但现在我仍然无法对孩子隐藏“id”,还有隐藏它的可能性吗?
【解决方案2】:

似乎唯一的方法无法获取嵌套参数,因此您应该使用自己的转换,例如:

$subset = $monitorList->map(function ($monitor) {
    $value = collect($monitor->toArray())->only('id', 'start_date', 'end_date')->all();
    $value['child'] = collect($monitor->child->toArray())->only('name', email')->all();      
    return $value;
});

【讨论】:

    猜你喜欢
    • 2016-05-19
    • 2021-10-20
    • 2017-03-07
    • 2018-09-23
    • 2015-07-07
    • 2018-09-22
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多