user7680802
user7680802

Reputation: 1

Return null from eloquent relationship?

I have this relationship in one of my model classes:

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

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

As you can see, it checks if the user is logged in and returns the Like record. However, how can I return null if the record doesn't exist?

I tried this:

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

    return null;
}

But I get the error:

local.ERROR: exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Call to a member function addEagerConstraints() on null' in /var/www/social/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php:680

As a side question, am I doing this right? Is this the correct way of doing this or is there a better way?

Upvotes: 0

Views: 977

Answers (3)

Upkareno
Upkareno

Reputation: 336

You can just use this style in your Like Model :

    // return the number of likes 
function userLikes()
{
    $count = $this->where('user_id', $this->post_id)->count();
    // check if not null 
    return $count ? $count : 0; // if null return 0
}

Upvotes: 0

ettdro
ettdro

Reputation: 350

I'm not sure it is the right way to do this. In your model you should only declare your relationships:

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

And then in a controller or something you go get the like of your user like this:

class LikesController extends Controller {

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

So we have a getLike() function that get the like of a user from your model Like where the user_id is equal to the authenticated user's id.

Hope it helps!

Upvotes: 2

Nieck
Nieck

Reputation: 1646

I'm not sure! But I think it is possible to use count! When it returns 0 you know that there are no records, so you can return null.

Upvotes: 0

Related Questions