Я упростил ваш код:
$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
, который должен содержать необходимые данные. Опять же, есть, вероятно, более элегантное решение, чем это.