У меня есть доступ к паре подобных коллекций,
$articleActions = EloArticleReferenceAction
::where('file', '=', $file)
->get()
->keyBy('type');
$referencesWithValidDois = EloDoi
::where('file', '=', $file)
->get();
И я хочу их объединить. Я не могу использовать merge
, потому что некоторые идентификаторы в обоих объектах похожи, и поэтому один перезапишет другой. Вместо этого я делаю это:
$response = collect();
foreach ($articleActions as $articleAction) {
$response->push($articleAction);
}
foreach ($referencesWithValidDois as $referencesWithValidDoi) {
$response->doi->push($referencesWithValidDoi);
}
Однако он ломается здесь. И когда я делаю что-то вроде этого:
$response = collect();
foreach ($articleActions as $articleAction) {
$response->push($articleAction);
}
$response['doi'] = [];
foreach ($referencesWithValidDois as $referencesWithValidDoi) {
$response['doi'] = $referencesWithValidDoi;
}
Это вроде как работает, но возвращает вот такой объект:
В котором свойство doi
перезаписывается текущим $referencesWithValidDoi
в итерации.
Итак, в настоящее время он отправляется обратно как:
0: {...},
1: {...},
2: {...},
3: {...},
doi: {...}
Но как я могу написать это, чтобы оно было отправлено обратно как:
0: {...},
1: {...},
2: {...},
3: {...},
doi: {
0: {...},
1: {...},
2: {...},
...
}
Обновлено: Делая это так,
$response = collect();
foreach ($articleActions as $articleAction) {
$response->push($articleAction);
}
$response['doi'] = [];
foreach ($referencesWithValidDois as $referencesWithValidDoi) {
$response['doi'][] = $referencesWithValidDoi;
}
Выдает ошибку:
Indirect modification of overloaded element of Illuminate\Support\Collection has no effect
У вас просто маленький шрифт, должен быть
$response = collect();
foreach ($articleActions as $articleAction) {
$response->push($articleAction);
}
$response['doi'] = [];
foreach ($referencesWithValidDois as $referencesWithValidDoi) {
$response['doi'][] = $referencesWithValidDoi;
}
обратите внимание на добавление [] после response['doi'] во втором foreach. Таким образом, вы фактически переписывали $reponse['doi'] каждый раз, а не добавляли в массив.
Как насчет $response['doi'] = $referencesWithValidDois
, так как это в основном все, что делает второй foreach?
Вот как я пытался это изначально в вопросе, до сих пор нет кости.
Ответ @Tharaka Dilshan сработал .. Я немного расстроен из-за того, что это не сработало, но все в порядке, я переживу это, лол
вы итеративно вводили единичные $referencesWithValidDoi в foreach. $response['doi'] = $referencesWithValidDois
(назначить весь массив сразу) по моему опыту следует избегать ошибки косвенного изменения.
Хорошо, да, это потому, что коллекции должны иметь одинаковые или похожие ресурсы данных. Таким образом, вы бы использовали опцию put()
Но при добавлении сабвуфера таким образом теряется преимущество коллекции, и это немного хакерски.
Правильный подход к этому в коллекции laravel следующий:
$response = $articleCollection->put('doi', $referencesWithValidDois);
if (!property_exists($collection, "bar")){
$collection->bar = collect();
}
$collection->bar->push("some data");
$collection->bar->push("some more data");
Пожалуйста, не публикуйте только код в качестве ответа, но также объясните, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением, как правило, более полезны и качественны, и с большей вероятностью привлекут положительные голоса.
Спасибо за быстрый ответ. Я тоже пробовал, но выдало ошибку
Indirect modification of overloaded element of Illuminate\Support\Collection has no effect
. Это коллекция, а не массив. Я сделал->toArray()
после вызова Eloquent, но он все еще не работает.