Laravel проверяет, пуста ли коллекция

У меня есть это в моем веб-приложении Laravel:

@foreach($mentors as $mentor)
    @foreach($mentor->intern as $intern)
        <tr class="table-row-link" data-href="/werknemer/{!! $intern->employee->EmployeeId !!}">
            <td>{{ $intern->employee->FirstName }}</td>
            <td>{{  $intern->employee->LastName }}</td>
        </tr>
    @endforeach
@endforeach

Как я могу проверить, есть ли $mentors->intern->employee?

Когда я делаю :

@if(count($mentors))

Он не проверяет это.


person Jamie    schedule 07.03.2016    source источник


Ответы (7)


Вы всегда можете пересчитать коллекцию. Например, $mentor->intern->count() вернет количество стажеров у наставника.

https://laravel.com/docs/5.2/collections#method-count

В вашем коде вы можете сделать что-то вроде этого

foreach($mentors as $mentor)
    @if($mentor->intern->count() > 0)
    @foreach($mentor->intern as $intern)
        <tr class="table-row-link" data-href="/werknemer/{!! $intern->employee->EmployeeId !!}">
            <td>{{ $intern->employee->FirstName }}</td>
            <td>{{  $intern->employee->LastName }}</td>
        </tr>
    @endforeach
    @else
        Mentor don't have any intern
    @endif
@endforeach
person otezz    schedule 07.03.2016

Чтобы определить, есть ли какие-либо результаты, вы можете выполнить одно из следующих действий:

if ($mentor->first()) { } 
if (!$mentor->isEmpty()) { }
if ($mentor->count()) { }
if (count($mentor)) { }
if ($mentor->isNotEmpty()) { }

Примечания/ссылки

->first()

https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Collection.html#method_first

isEmpty() https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Collection.html#method_isEmpty

->count()

https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Collection.html#method_count

count($mentors) работает, потому что Collection реализует Countable и внутренний метод count():

https://laravel.com/api/5.7/Illuminate/Database/Eloquent/Collection.html#method_count

isNotEmpty()

https://laravel.com/docs/5.7/collections#method-isnotempty

Итак, что вы можете сделать, это:

if (!$mentors->intern->employee->isEmpty()) { }
person Drudge Rajen    schedule 07.03.2016
comment
да я это знаю, но у наставника не всегда есть стажер. Так как я мог это проверить? - person Jamie; 07.03.2016
comment
`if ($mentors-›has('стажер')){} - person brianlmerritt; 30.01.2021

Начиная с Laravel 5.3, вы можете просто использовать:

if ($mentor->isNotEmpty()) {
//do something.
}

Документация https://laravel.com/docs/5.5/collections#method-isnotempty

person Mohamed Salem Lamiri    schedule 30.10.2017

Это самый быстрый способ:

if ($coll->isEmpty()) {...}

Другие решения, такие как count, делают немного больше, чем вам нужно, что требует немного больше времени.

Кроме того, имя isEmpty() довольно точно описывает, что вы хотите там проверить, чтобы ваш код был более читабельным.

person Csongor Halmai    schedule 17.07.2017

Из php7 вы можете использовать Null Оператор объединения:

$employee = $mentors->intern ?? $mentors->intern->employee

Это вернет Null или сотрудника.

person d.raev    schedule 26.09.2018
comment
Я думаю, это вызовет ошибку, если $mentors-›intern будет NULL. правильный путь такой: $employee = $mentors->intern ?? NULL - person Saeed; 15.05.2020

Это лучшее решение, которое я нашел до сих пор.

в лезвии

@if($mentors->count() == 0)
    <td colspan="5" class="text-center">
        Nothing Found
    </td>
@endif

в контроллере

if ($mentors->count() == 0) {
    return "Nothing Found";
}
person Kesara Wimal    schedule 08.06.2020

я предпочитаю

(!$mentor)

Является более эффективным и точным

person Marcello Patto    schedule 25.07.2018
comment
Почему это будет более эффективным и более точным? - person Silidrone; 06.01.2021