Объединение двух коллекций Laravel

У меня болит голова от работы с коллекциями Laravel. У меня есть две коллекции:

    $dt = Carbon::now();
$days = new Collection([]);

/**
* Create a calender month
*/
for ($day = 1; $day <= $dt->daysInMonth; $day++) {
$date = Carbon::create($dt->year, $dt->month, $day)->toDateString();
$days->push(new Timesheet([
'date' => $date,
]));
}

/**
* Get all timesheets for user
*/
$timesheets = Timesheet::where('user_id', $this->user->id)
->get();

\Illuminate\Database\Eloquent\Collection ($timesheets)

#attributes: array:5 [▼
"id" => "1""user_id" => "1""date" => "2016-02-22 22:05:01""created_at" => "2016-02-22 22:05:01""updated_at" => "2016-02-22 22:05:01"]
// ... one or more ...

У меня есть вторая коллекция, дающая мне все дни за данный месяц.

\Illuminate\Support\Collection ($days)

#attributes: array:1 [▼
"date" => "2016-02-01 00:00:00"]
// ... and the rest of the month.

Я хочу объединить $days Коллекция с $timesheet коллекция, сохраняющая значения $timesheet сбор и удаление любых дубликатов, присутствующих в $days коллекция. Например если $timesheets уже содержит '2016-02-24' я не делайте хочу слить '2016-02-24' от $days, Как мне это сделать?

4

Решение

ОК, попробуй с этим. Логика должна сработать, но у obv не было доступа к вашему классу расписания.

$days = new Collection([]);

//basically the same structure i think
$timesheets = new Collection([new Collection(['date'=>'2016-02-23','created_at'=>'2016-02-23 14:12:34']),new Collection(['date'=>'2016-02-28','created_at'=>'2016-02-23 14:15:36'])]);

$dt = Carbon::now();

for ($day = 1; $day <= $dt->daysInMonth; $day++) {

$date = Carbon::create($dt->year, $dt->month, $day)->format('Y-m-d');

//filter your timesheets and see if there is one for this day
$timesheet = $timesheets->filter(function($timesheet) use($date){return $timesheet->get('date')==$date;});

if(!$timesheet->isEmpty()){
//if there is a timesheet for today then add it to your $days collection
$days->push($timesheet);
}else{
//otherwise just stick in the date
$days->push(new Collection([
'date' => $date,
]));
}
}

//voila!
dd($days);
1

Другие решения

использование merge:

$collection1 = Model1::all();
$collection2 = Model2::all();
$mergedCollection = $collection1->merge($collection2);

Документация

Документация говорит об использовании его с массивами, но, глядя на подпись метода это займет смешанные аргументы. Тестирование его на локальной установке проекта Laravel 4 работало на меня.

5

Я не уверен, почему $merged = $timesheets->merge($days); слил только последний элемент. Может быть, кто-то еще может пролить свет на это.

Но пока нет лучшего решения, вы можете сделать это —

$merged = array_merge($timesheets->toArray(), $days->toArray());

Надеюсь это поможет.

2
По вопросам рекламы [email protected]