Laravel 5.1 пытается получить свойство красноречивых отношений, не связанных с объектом, ошибка обработки

ОрганизацииController.php

public function user_index()
{   
    if(!is_null(Organization::find(Auth::user()->player->organization))) 
    $organization = Organization::find(Auth::user()->player->organization->id);
    else $organization=null;

    return view('organizations.user_index', [ 'organization' => $organization ]);
}

Чтобы избежать «попытки получить свойство не-объекта», когда «игрок» не имеет «организации», я использовал этот код. Но это не кажется очень красивым. Есть лучший способ получить это? Может быть, я ошибаюсь, но с этим методом есть бесполезный запрос, я прав?

Настольный игрок: id, имя

Организация таблицы: id, name, player_id


person Manuel Vencato    schedule 14.08.2015    source источник
comment
Можете ли вы дать мне столбцы вашей базы данных?   -  person aldrin27    schedule 14.08.2015
comment
да, спасибо. но я думаю, что они бесполезны.   -  person Manuel Vencato    schedule 14.08.2015


Ответы (2)


Если предположить, что user hasOne player и player hasOne organization, и эти отношения настроены правильно, то Organization::find() вообще не нужен. Атрибут organization уже будет загруженным объектом Organization, поэтому нет необходимости его повторно находить.

public function user_index() {
    // default to null
    $organization = null;

    // make sure there is an authenticated user and it has a player
    if (Auth::user() && Auth::user()->player) {
        // if the player has an organization, this will be the Organzation object
        // if the player does not have an organization, this will be null
        $organization = Auth::user()->player->organization;
    }

    return view('organizations.user_index', [ 'organization' => $organization ]);
}
person patricus    schedule 14.08.2015

Да, для этой проверки вы можете выполнить один ненужный SQL-запрос. Вы можете избавиться от этого, если сделаете:

if(Organization::find(Auth::user()->player->organization_id) 

вместо

if(!is_null(Organization::find(Auth::user()->player->organization))) 

Таким образом вы проверяете organization_id, который хранится в player, прежде чем пытаться получить organization из базы данных.

person jedrzej.kurylo    schedule 14.08.2015
comment
на самом деле у меня нет id_organization... внешний ключ находится в организации - person Manuel Vencato; 14.08.2015
comment
Не могли бы вы вставить определение отношения? Если у игрока может быть только одна организация, я ожидал, что внешний ключ будет храниться в проигрывателе. - person jedrzej.kurylo; 14.08.2015
comment
Ну, у игрока может быть только одна организация, а у организации может быть только один игрок. Я поставил внешний ключ на организацию :) - person Manuel Vencato; 14.08.2015
comment
В этом случае невозможно проверить, существует ли организация с данным player_id в базе данных, не выполняя запрос к таблице организаций. - person jedrzej.kurylo; 14.08.2015