2014-09-26 4 views
5

Я пытаюсь объединить несколько объектов (например, квитанции, отчеты и т. Д.) С помощью .Слияние нескольких объектов, которые используют один и тот же идентификатор

Это код я использовал:

$receipts = Receipt::all(); 
$reports = Report::all(); 

$collection = $receipts->merge($reports); 

Это результат:

enter image description here

, приведенный выше снимок экрана показывает два элемента, а третий элемент отсутствует, поскольку он имеет тот же идентификатор (id: «1») как первый. То, что я пытаюсь достичь, состоит в том, чтобы отобразить все три из них в виде коллекции.

EDIT:

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

$collection->sort(function($a, $b) 
    { 
     $a = $a->created_at; 
     $b = $b->created_at; 
     if ($a === $b) { 
      return 0; 
     } 
     return ($a > $b) ? 1 : -1; 
    }); 
+0

Нет причин, по которым это слияние не должно работать. Коллекция не зависит от каких-либо свойств элементов. Под капотом 'merge()' является просто массивом элементов array_merge.Как выглядит объект Report? – tomvo

ответ

0

Вы можете поместить все коллекции в массив и использовать это. Зависит от того, что вы хотите сделать с коллекцией.

$list = array(); 
$list = array_merge($list, Receipt::all()->toArray()); 
$list = array_merge($list, Report::all()->toArray()); 
+0

см. Мое редактирование. Я также пробовал это, но мне нужны результаты, чтобы быть Красноречивыми объектами. – user3811576

4

Я знаю, что это старый вопрос, но я все равно буду дать ответ только в случае, если кто-то приходит сюда из поиска, как я сделал.

Если вы попытаетесь объединить две разные красноречивые коллекции в одну, а некоторые объекты имеют один и тот же идентификатор, один перепишет другой. Я не знаю, почему он это делает, и если это ошибка или функция - нужны дополнительные исследования. Чтобы исправить это, просто используйте метод push() или переосмыслите свой подход к проблеме, чтобы этого избежать.

Пример задачи:

$cars = Car::all(); 
$bikes = Bike::all(); 
$vehicles = $cars->merge($bikes); 
// if there is a car and a bike with the same id, one will overwrite the other 

Возможное решение:

$collection = collect(); 
$cars = Car::all(); 
$bikes = Bike::all(); 

foreach ($cars as $car) 
    $collection->push($car); 

foreach ($bikes as $bike) 
    $collection->push($bike); 

Источник: https://medium.com/@tadaspaplauskas/quick-tip-laravel-eloquent-collections-merge-gotcha-moment-e2a56fc95889

2

Я знаю, что я натыкаясь на 4 лет нить, но я наткнулся на это и ни один из ответов не был тем, что я искал; так что, как @Tadas, я оставлю свой ответ людям, которые столкнутся с этим. После тщательного изучения документации laravel 5.5 я обнаружил, что concat был методом go-to. Так, в случае с ФП в правильном решение будет:

$receipts = Receipt::all(); 
$reports = Report::all(); 

$collection = $receipts->concat($reports); 

Таким образом каждые элемента в коллекции отчетов будет добавлен каждый элемента в коллекции расписок, событие, если некоторые поля идентичны.

В конце концов вы можете перетасовать его, чтобы получить более визуальный привлекательный результат, например. вид:

$collection->shuffle(); 
Смежные вопросы