Laravel не может сгладить массив после сбора-> забыть - PullRequest
0 голосов
/ 17 мая 2019

У меня есть цикл внутри цикла в коллекции Laravel, и иногда мне нужно удалить некоторые объекты из второй коллекции цикла. Вот код

public function remove_if_found($id)
{
    $all_groups = Group::all();
    $all_groups->load('templates');

    foreach ($all_groups as $group)
    {
        foreach ($group->templates as $key => $template)
        {
            if($template->id = $id)
            {
                $group->templates->forget($key);
            }
        }
    }

    return $all_groups;
}

Проблема в том, что коллекция group-> шаблонов превращается из простого (не связанного) массива в объект. Вот пример того, как выглядит ответ

explanation

Я пытаюсь сгладить $ group-> templates-> flatten (), но в окончательном ответе шаблоны по-прежнему как объект, но не как массив.

Этот тест сглаживает работы

    ...
    foreach ($all_groups as $group)
    {
        foreach ($group->templates as $key => $template)
        {
            if($template->id = $id)
            {
                $group->templates->forget($key);
            }
        }

        return $group->templates->flatten()//This code works i get fluttened array
    }

Но окончательный вариант все равно возвращает мне объект вместо массива

    $all_groups = Group::all();
    $all_groups->load('templates');

    foreach ($all_groups as $group)
    {
        foreach ($group->templates as $key => $template)
        {
            if($template->id = $id)
            {
                $group->templates->forget($key);
            }
        }

        $group->templates->flatten()//Use flatten here
    }

    return $all_groups;//Templates are returned not as an array but still as an object (Same variant as on attached image)
}

1 Ответ

1 голос
/ 17 мая 2019

Используйте values() для сброса ключей и setRelation() для замены отношения:

public function remove_if_found($id)
{
    $all_groups = Group::all();
    $all_groups->load('templates');

    foreach ($all_groups as $group)
    {
        foreach ($group->templates as $key => $template)
        {
            if($template->id = $id)
            {
                $group->setRelation('templates', $group->templates->forget($key)->values());
            }
        }
    }

    return $all_groups;
}

Вы также можете использовать except() вместо forget():

public function remove_if_found($id)
{
    $all_groups = Group::all();
    $all_groups->load('templates');

    foreach ($all_groups as $group)
    {
        $group->setRelation('templates', $group->templates->except($id));
    }

    return $all_groups;
}
...