Изменить объект внутри объекта в цикле - PullRequest
0 голосов
/ 24 октября 2019

Моя цель - добавить редактирование объекта в другой объект.

В приведенном ниже коде вы можете видеть две базы данных, где одна была в значении другой (collection1 в collection), это прекрасно работает каквсе данные были добавлены. В последнем разделе кода вы видите, как я пытаюсь добавить новое значение к значению allSub в объекте коллекции. Вот где проблема заключается в добавлении данных, но они показывают идентификатор самого высокого уровня. Например;event_type_id должен быть от 1 до 15, тест, как показано, показывает правильное число (в пределах верхнего уровня), но значение allSub имеет тот же номер, 15.

Мне нужно это, чтобы показать правильный связанный идентификатор какЯ собираюсь передать его функции.

$collection = DB::table('event_types')->get();

$collection1 = DB::table('event_types_sub')->get();


foreach ($collection as $key => $value) {

  $collection[$key]->allSub = $collection1;

}

 foreach ($collection as $key1 => $value1) {

   $collection[$key1]->test = $value1->event_type_id;

   foreach ($value1->allSub as $key2 => $value2) {

     $collection[$key1]->allSub[$key2]->check = $value1->event_type_id;

   }

 }
  • Карта Laravel возвращает тот же результат

1 Ответ

0 голосов
/ 24 октября 2019

Я упростил ваш код:

$types = DB::table('event_types')->get();
$subs = DB::table('event_types_sub')->get();

foreach ($types as $type) {
    $type->subs = $subs;
    $type->test = $type->event_type_id;

    foreach ($type->subs as $sub) {
        $sub->check = $type->event_type_id;
    }
}

Поскольку вы работаете с объектами, они всегда передаются по ссылке, а не копируются. Таким образом, на каждой итерации в цикле $types вы переопределяете свойство check в одной коллекции $subs. Последняя итерация с идентификатором 15, поэтому единственный набор $subs переопределяется, чтобы иметь check = 15. Чтобы добиться того, что вы пытаетесь сделать, вам нужно сделать глубокую копию этой коллекции. Но если вы дошли до этой точки, это, вероятно, означает, что вы делаете что-то не так, и есть лучший способ решить вашу проблему.

Другая вещь, которую вы можете сделать, - это преобразовать обе коллекции в массивы, а затем $subsбудет скопирован для каждого $type:

$types = DB::table('event_types')->get()->toArray();
$subs = DB::table('event_types_sub')->get()->toArray();

foreach ($types as &$type) { // must use reference (&)
    $type['subs'] = $subs; // $subs array is copied
    $type['test'] = $type['event_type_id'];

    foreach ($type['subs'] as &$sub) { // must use reference (&)
        $sub['check'] = $type['event_type_id'];
    }
}

Тогда у вас есть массив $types, который должен содержать необходимые данные. Опять же, есть, вероятно, более элегантное решение, чем это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...