web-dev-qa-db-ja.com

Laravel map():オブジェクトと配列を変更するには?

多次元コレクションを持っています。私はそれを繰り返して、map()関数を使用してその子オブジェクトと配列の一部を変更します: https://laravel.com/docs/5.1/collections#method-map

サンプルコンテンツ:

[
    {
        'address': 'Somestreet 99'
        'orders': [
            {'id': 11},
            {'id': 67}
        ]
    }
]

  $deliveries = $delivery_addresses->map(function($delivery_address){
     $orders = $delivery_address->orders->filter(function($order){
        return $order->id == 67;
     });

     $delivery_address['address'] = 'A different street 44'
     $delivery_address['orders'] = $orders;
     $delivery_address['a_new_attribute'] = 'Some data...';

     return $delivery_address;
  });

期待される結果:

[
    {
        'address': 'A different street 44'
        'orders': [
            {'id': 67}
        ],
        'a_new_attribute': 'Some data...;
    }
]

その結果、文字列型の変数のみが変更されます。配列やオブジェクトは同じままです。これはなぜですか、どうすれば回避できますか?ありがとう! =)

10
MikaelL
collect($deliver_addresses)->map(function ($address) use ($input) {

    $address['id']              = $input['id'];
    $address['a_new_attribute'] = $input['a_new_attribute'];

    return $address;

});
18

最近の編集に対処するには、これを試してください:

$deliveries = $deliver_addresses->map(function($da) {
    $orders = $da->orders->filter(function($order) {
        return $order->id == 67;
    });

    $da->unused_attribute = $orders->all();

    return $da;
});

ここで最も可能性が高いのは、その属性を正しく上書きしている場合です。次に、それにアクセスしようとしているときLaravelは、orders()の関係を照会し、変更を取り消しています。Laravelに関する限り、これらは同じです。

$delivery_address->orders;
$delivery_address['orders'];

これが、変更がオブジェクトに対してのみ機能する理由です。永続的に保存したい場合は、実際に保存します。そうでない場合は、一時的な属性を使用してそのデータを含めます。

6
Sturm