Laravel итерация сложного объекта

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

Получаю ошибку Invalid argument supplied for foreach()

Заранее благодарю за любую помощь, так как я, кажется, зациклился на мыслях и не могу найти, что делаю неправильно.

В контроллере я вызываю БД:

$team = \App\User::where('users.state', 1)->with('profile','jobs','photos')->get();
$team->jsonSerialize();

Что я сделал, чтобы зациклиться на представлении переменной, содержащей объект, который выдает ошибку

            <li>
                <a href = "/{!! str_slug(trans('menus.lawyers'), '-') !!}/{!! str_slug(trans('global.words.partners')) !!}" title = "{!! trans('global.words.partners') !!}">{!! trans('global.words.partners') !!}</a>
                <ul class = "dropdown">
                    @foreach($team as $member)
                        @foreach($member->jobs as $jobs)
                            // just display if partner | socio
                            @if ($jobs->slug== 'socio' || $jobs->slug == 'partner')
                                @foreach($member->profile as $profile)
                                    <li>
                                        <a href = "/{!! str_slug(trans('global.words.lawyer_male'), '-') !!}/{!! $member->profile->full_name_slug !!}" title = "{!! $member->profile->full_name !!}"><img class = "avatar" src = "{{ asset('/images/staff/thumbs/'.$member->photos[3]->filename) }}" alt = "{!! $member->profile->full_name !!}"> {!! $member->profile->full_name !!}
                                        </a>
                                    </li>
                                @endforeach
                            @endif
                        @endforeach
                    @endforeach
                </ul>
            </li>

Объект (сокращенная версия):

0 => array:15 [▼ "id" => 2 "guid" => "0b6e0ad2-7daa-4c2b-907a-d095ab577851" "name" => "John Doe" "slug" => "john-doe" "email" => "[email protected]" "state" => 1 "ordering" => 0 "created_by" => 1 "updated_by" => null "deleted_by" => null "created_at" => "2018-02-12 19:59:47" "updated_at" => "2018-02-12 19:59:52" "profile" => array:23 [▼ "id" => 2 "user_id" => 2 "full_name" => "John Doe McNamara" "full_name_slug" => "john-doe-mcnamara" "short_name" => "John Doe" "short_name_slug" => "john-doe-mcnamara" "gender" => "male" "birth_date" => "1973-05-05" "work_start" => "2000-01-01" "work_end" => null "biography" => "John Doe started the firm in 1900." "experience" => "A couple of years" "education" => """ UCLA;\n Berkley """ "affiliations" => "" "notes" => "" "hits" => 3 "state" => 1 "ordering" => 0 "created_by" => 1 "updated_by" => null "deleted_by" => null "created_at" => "2018-02-12 20:07:00" "updated_at" => "2018-02-24 12:32:52" ] "jobs" => array:2 [▼ 0 => array:15 [▼ "id" => 1 "guid" => "45f91a68-d219-42b1-8980-8cb77d6688b4" "type" => "Lawyer" "slug" => "lawyer" "department" => "Law" "notes" => null "language" => "en" "state" => 1 "ordering" => 4 "created_by" => 1 "updated_by" => null "deleted_by" => null "created_at" => "2018-02-11 01:43:04" "updated_at" => null "pivot" => array:2 [▼ "user_id" => 2 "job_id" => 1 ] ] 1 => array:15 [▼ "id" => 11 "guid" => "fcf9f310-eeb1-4ff4-b133-6c80d6bf3b7f" "type" => "Partner" "slug" => "partner" "department" => "Law" "notes" => null "language" => "en" "state" => 1 "ordering" => 1 "created_by" => 1 "updated_by" => null "deleted_by" => null "created_at" => "2018-02-11 01:49:38" "updated_at" => null "pivot" => array:2 [▼ "user_id" => 2 "job_id" => 11 ] ] ] "photos" => array:4 [▼ 0 => array:14 [▼ "id" => 5 "guid" => null "user_id" => 2 "type" => "profile" "directory" => "staff" "subdirectory" => "profile" "filename" => "[email protected]" "state" => 1 "ordering" => 0 "created_by" => 1 "updated_by" => null "deleted_by" => null "created_at" => "2018-02-12 20:03:31" "updated_at" => null ] 1 => array:14 [▼ "id" => 6 "guid" => null "user_id" => 2 "type" => "bgs" "directory" => "staff" "subdirectory" => "bgs" "filename" => "[email protected]" "state" => 1 "ordering" => 0 "created_by" => 1 "updated_by" => null "deleted_by" => null "created_at" => "2018-02-12 20:03:49" "updated_at" => null ] 2 => array:14 [▶] 3 => array:14 [▶] ] ] 1 => array:15 [▶] 2 => array:15 [▶] 3 => array:15 [▶] 4 => array:15 [▶] 5 => array:15 [▶] 6 => array:15 [▶] 7 => array:15 [▶] 8 => array:15 [▶] 9 => array:15 [▶] 10 => array:15 [▶] 11 => array:15 [▶] 12 => array:15 [▶] 13 => array:15 [▶] ]

Я не уверен, почему это происходит. Попробуйте определить, какой именно foreach вызывает эту ошибку. Но есть ли какая-то особая причина, по которой вы звоните в $team->jsonSerialize();? Я не думаю, что это что-то делает.

DevK 10.03.2018 19:53

Я пытался не вызывать какой-либо метод и не получать объект, попробовал ->toArray(), а теперь и ->jsonSerialize();, чтобы выяснить, может ли это быть одной из причин.

McRui 10.03.2018 19:55

Не звоните никому из них. Запрос вернет Laravel collection, который объективно лучше массива. И JSON не имеет смысла, поскольку вы используете его с PHP. Кроме того, я почти уверен, что он буквально ничего не делает, поскольку вам нужно явно переопределить объект $users. В любом случае попробуйте определить, какой из foreach вызывает ошибку. Вероятно, в сообщении об ошибке указано кешированное представление. Вы можете перейти к нему в большинстве современных текстовых редакторов, используя Ctrl + P и введя первые несколько символов.

DevK 10.03.2018 19:58

Похоже, ошибка идет по шлейфу @foreach($member->profile as $profile)

McRui 10.03.2018 20:22

Чтобы заставить его работать, я обнаружил, что мне не нужен цикл @foreach($member->profile as $profile). Тогда я должен назвать, например, {!! $member->profile['full_name'] !!}, и вот так он работает.

McRui 10.03.2018 21:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
5
33
1

Ответы 1

Вы получаете сообщение об ошибке, если вы использовали JsonSerializeed

Вот код, который вы можете использовать

$team = \App\User::where('users.state', 1)->with('profile','jobs','photos')->get();

и, на ваш взгляд, повторяйте его, как вы уже делаете

 <li>
                <a href = "/{!! str_slug(trans('menus.lawyers'), '-') !!}/{!! str_slug(trans('global.words.partners')) !!}" title = "{!! trans('global.words.partners') !!}">{!! trans('global.words.partners') !!}</a>
                <ul class = "dropdown">
                    @foreach($team as $member)
                        @foreach($member->jobs as $jobs)
                            // just display if partner | socio
                            @if ($jobs->slug== 'socio' || $jobs->slug == 'partner')
                                @foreach($member->profiles as $profile)
                                    <li>
                                        <a href = "/{!! str_slug(trans('global.words.lawyer_male'), '-') !!}/{!! $member->profile->full_name_slug !!}" title = "{!! $member->profile->full_name !!}"><img class = "avatar" src = "{{ asset('/images/staff/thumbs/'.$member->photos[3]->filename) }}" alt = "{!! $member->profile->full_name !!}"> {!! $member->profile->full_name !!}
                                        </a>
                                    </li>
                                @endforeach
                            @endif
                        @endforeach
                    @endforeach
                </ul>
            </li>

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

Хотя я согласен, что это может вызвать проблемы, если он использует его без явного переопределения переменной $users, он ничего не делает. Также, если он это сделает, первый foreach должен работать, а $member->jobs должен выдать другую ошибку (вызов метода для не-объекта).

DevK 10.03.2018 20:12

Laravel levaral, использовал предложенный вами код, но все еще получаю ошибку.

McRui 10.03.2018 20:18

Похоже, что сейчас я получаю ошибку на @foreach($member->profile as $profile).

McRui 10.03.2018 20:20

@McRui да вы правы @foreach ($ member-> profile as $ profile) генерирует ошибку

Adnan Mumtaz 10.03.2018 20:26

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