Вернуть ноль из красноречивых отношений?

У меня есть это отношение в одном из моих классов модели:

public function userLike()
{
    if (Auth::check()) return $this->hasOne('App\Like')->where('user_id', Auth::user()->id);

    // RETURN NULL IF RECORD DOESN'T EXIST?
}

Как видите, он проверяет, вошел ли пользователь в систему, и возвращает запись Like. Однако как я могу вернуть значение null, если запись не существует?

Я пробовал это:

public function userLike()
{
    if (Auth::check()) return $this->hasOne('App\Like')->where('user_id', Auth::user()->id);

    return null;
}

Но получаю ошибку:

local.ERROR: исключение «Symfony \ Component \ Debug \ Exception \ FatalErrorException» с сообщением «Вызов функции-члена addEagerConstraints () при нулевом значении» в / var / www / social / vendor / laravel / framework / src / Illuminate / Database / Красноречивый / Builder.php: 680

В качестве побочного вопроса, правильно ли я это делаю? Это правильный способ сделать это или есть лучший способ?


person user7680802    schedule 08.03.2017    source источник


Ответы (2)


Я не уверен! Но я думаю, что можно использовать count! Когда он возвращает 0, вы знаете, что записей нет, поэтому вы можете вернуть null.

person Nieck    schedule 08.03.2017

Я не уверен, что это правильный способ сделать это. В своей модели вы должны только декларировать свои отношения:

public function userLike()
{
    return $this->hasOne('App\Like');
}

А затем в контроллере или чем-то подобном вы получите подобное от своего пользователя:

class LikesController extends Controller {

    public function getLike()
    {
        $like = null;
        if (Auth::check()) {
            $like = Like::where('user_id', Auth::user()->id)->first();
        }
    }
}

Итак, у нас есть getLike() функция, которая похожа на пользователя из вашей модели Like, где user_id равен идентификатору аутентифицированного пользователя.

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

person ettdro    schedule 09.03.2017