Как я могу получить доступ к вложенным массивам в laravel - PullRequest
0 голосов
/ 11 января 2020

Я использую jquery повторитель вложенных форм. Когда я отправляю форму, я получаю эти значения.

Illuminate\Http\Request {#51 ▼
  +request: Symfony\Component\HttpFoundation\ParameterBag {#52 ▼
    #parameters: array:22 [▼
      "_token" => "brgVhd3F1K0wWqxsjDn6Vf9gBdKLX8CO8XbpkBJJ"
      "options" => array:2 [▼
        0 => array:4 [▼
          "name" => "Color"
          "type" => "dropdown"
          "is_required" => array:1 [▶]
          "values" => array:1 [▼
            0 => array:3 [▼
              "label" => "Red"
              "price" => "100"
              "price_type" => "fixed"
            ]
          ]
        ]
        1 => array:3 [▼
          "name" => "Size"
          "type" => "dropdown"
          "values" => array:1 [▼
            0 => array:3 [▼
              "label" => "s"
              "price" => "100"
              "price_type" => "percent"
            ]
          ]
        ]
      ]
    ]
  }
}

Я пытался использовать это. Но это дает мне попытку получить свойство name для необъекта;

foreach ($request->input('options') as $option) {

    Option::create([

        'name' => $option->name,

        'type' => $option->type,

         'is_required' => (boolean) $option->is_required
    ]);


     $option->values()->createMany($request->input('options.*.values'));

}

Как получить доступ к значениям?

Пожалуйста, помогите мне решить эту проблему.

Спасибо.

Ответы [ 2 ]

1 голос
/ 11 января 2020

Причина, по которой вы столкнулись с этой проблемой, заключается в том, что $request->input() будет возвращать массив, а не объекты, поэтому по большей части вы просто пытались получить доступ к свойству неверным способом, т.е. $options->name должно было быть $options['name'].

Во-вторых, $option->values()->createMany($request->input('options.*.values')); также не сработал бы, так как он бы возвратил вложенный массив всех значений, а не только значений для этой опции.

Следующее должно дать вам то, что Вы после:

foreach ($request->input('options') as $option) {

    $option = Option::create([
        'name'        => $option['name'],
        'type'        => $option['type'],
        'is_required' => (boolean)$option['is_required'],
    ]);

    $option->values()->createMany($option['values']);
}

Это просто К вашему сведению.

Я бы порекомендовал использовать свойство $ casts внутри вашей модели Eloquent, если вы ' еще не:

protected $casts = [
    'is_required' => 'boolean',
];

Таким образом, вы можете сказать Eloquent, что is_required должен быть логическим, и вам не нужно будет разыгрывать его самостоятельно, так что в вашем foreach l oop

'is_required' => (boolean)$option['is_required'],  

будет просто

'is_required' => $option['is_required'],
0 голосов
/ 11 января 2020

Вы можете попробовать следующий метод

foreach ($request['options'] as $option) {
    Option::create([
        'name' => $option->name,
        'type' => $option->type,
         'is_required' => (boolean) $option->is_required
    ]);
    $option->values()->createMany($request->input('options.*.values'));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...