Добавление нового свойства в коллекцию Laravel

У меня есть доступ к паре подобных коллекций,

    $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;
    }

Это вроде как работает, но возвращает вот такой объект:

Добавление нового свойства в коллекцию Laravel

В котором свойство 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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
2
0
5 852
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

У вас просто маленький шрифт, должен быть

$response = collect();

foreach ($articleActions as $articleAction) {
    $response->push($articleAction);
}

$response['doi'] = [];

foreach ($referencesWithValidDois as $referencesWithValidDoi) {
    $response['doi'][] = $referencesWithValidDoi;
}

обратите внимание на добавление [] после response['doi'] во втором foreach. Таким образом, вы фактически переписывали $reponse['doi'] каждый раз, а не добавляли в массив.

Спасибо за быстрый ответ. Я тоже пробовал, но выдало ошибку Indirect modification of overloaded element of Illuminate\Support\Collection has no effect . Это коллекция, а не массив. Я сделал ->toArray() после вызова Eloquent, но он все еще не работает.

Mike K 08.04.2019 19:22

Как насчет $response['doi'] = $referencesWithValidDois, так как это в основном все, что делает второй foreach?

danronmoon 08.04.2019 19:29

Вот как я пытался это изначально в вопросе, до сих пор нет кости.

Mike K 08.04.2019 19:30

Ответ @Tharaka Dilshan сработал .. Я немного расстроен из-за того, что это не сработало, но все в порядке, я переживу это, лол

Mike K 08.04.2019 19:31

вы итеративно вводили единичные $referencesWithValidDoi в foreach. $response['doi'] = $referencesWithValidDois (назначить весь массив сразу) по моему опыту следует избегать ошибки косвенного изменения.

danronmoon 08.04.2019 19:33

Хорошо, да, это потому, что коллекции должны иметь одинаковые или похожие ресурсы данных. Таким образом, вы бы использовали опцию put()

ColinMD 08.04.2019 19:36

Но при добавлении сабвуфера таким образом теряется преимущество коллекции, и это немного хакерски.

ColinMD 08.04.2019 19:40
Ответ принят как подходящий

Правильный подход к этому в коллекции 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");

Пожалуйста, не публикуйте только код в качестве ответа, но также объясните, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением, как правило, более полезны и качественны, и с большей вероятностью привлекут положительные голоса.

Mark Rotteveel 15.05.2021 09:47

Другие вопросы по теме