Laravel @if или @isset ничего не показывают или дают исключение

Я сделал в laravel v.8. запрос к базе данных (красноречивый), который возвращает несколько столбцов.

$wgName = Auth::user()
            ->join('wg_groups', 'users.wg_group_id', '=', 'wg_groups.id')
            ->get();

Laravel @if или @isset ничего не показывают или дают исключение

Теперь я хочу, чтобы в моем представлении html отображалось wg_name, если оно установлено. Я пробовал следующие четыре вещи:

@if (isset($wgName->wg_name))

    <h1>{{$wgName->wg_name}}</h1>

@endif

Здесь просто ничего не отображается

@if (isset($wgName))

    <h1>{{$wgName->wg_name}}</h1>

@endif

Исключение: свойство [wg_name] не существует в этом экземпляре коллекции.

@isset($wgName)

    <h1>{{$wgName->wg_name}}</h1>

@endisset

Исключение: свойство [wg_name] не существует в этом экземпляре коллекции.

@isset($wgName->wg_name)

    <h1>{{ $wgName->wg_name }}</h1>

@endisset

Здесь просто ничего не отображается

Я понятия не имею, почему это не работает, и я ничего не нашел в документации. https://laravel.com/docs/8.x/красноречивый

->get() возвращает коллекцию, а не модель.
gre_gor 15.05.2022 13:39

@gre_gor фф, спасибо! я заменил «get ()» на «firstOrFail», теперь он работает так, как я хочу!

OnlyProblems 15.05.2022 13:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
31
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В настоящее время вы выбираете всех пользователей из базы данных. Это происходит из-за того, что Eloquent перенаправляет несуществующие методы на новый экземпляр построителя запросов.

Изменив запрос, чтобы использовать метод first() вместо метода get(), вы получите только одну запись, но, вероятно, это будет неправильная запись, поскольку она не учитывает текущего пользователя.

Есть несколько способов решить эту проблему

1: Просто используйте простой запрос, чтобы получить wg_name.

$wgName = DB::table('wg_groups')->find(Auth::user()->wg_group_id);

2: Добавьте глобальную область видимости к вашей модели User, чтобы всегда объединять данные wg_group при поиске пользователя.

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

protected static function booted()
{
    self::addGlobalScope('include_wg_group', function (\Illuminate\Database\Eloquent\Builder $query) {
        $query->join('wg_groups', 'users.wg_group_id', '=', 'wg_groups.id');
    });
}

Теперь каждый раз, когда вы получаете экземпляр User, к нему будет присоединена вся информация wg_groups. Это позволяет вам просто получить имя следующим образом:

$wgName = Auth::user()->wg_name;
Ответ принят как подходящий

Вызов ->get() в построителе запросов даст вам экземпляр коллекции, содержащий нескольких пользователей. И в экземпляре Collection определенно нет wg_name, поэтому результат всегда ложный.

Попробуйте использовать first():

$wgName = Auth::user()
            ->join('wg_groups', 'users.wg_group_id', '=', 'wg_groups.id')
            ->first();

Предупреждение, это всегда будет выбирать первую запись пользователя, поэтому это даст неверный результат, если в вашей системе несколько пользователей.

Roj Vroemen 15.05.2022 13:48

@RojVroemen, конечно, но я не хотел менять запрос. просто исправить причину ошибки.

Saeid Asadi 15.05.2022 13:51

Это запрос, который выходит при таком запросе: select * from users inner join wg_groups on users.wg_group_id = wg_groups.id limit 1

Roj Vroemen 15.05.2022 14:02

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