4

I'm wondering if it's possible to access the current object when accessing a method of that object. for example the method fullname() below is used to get the full name of the user.

class User extends Eloquent 
{

    public function itineraries() {
        return $this->has_many('Itinerary', 'user_id');
    }

    public function reviews() {
        return $this->has_many('Placereview', 'user_id');
    }

    public function count_guides($user_id){
        return Itinerary::where_user_id($user_id)->count();
    }

    public static function fullname() {
        return $this->first_name . ' ' . $this->last_name; // using $this as an example
    }
}

A user has a first_name field and a last_name field. Is there anyway I can do

$user = User::where('username', '=', $username)->first();

echo $user->fullname();

Without having to pass in the user object?

4
  • 1
    Can you just chain them? $fullName = User::where('username', '=', $username)->first()->fullname(); ? Commented May 12, 2013 at 15:43
  • I could. But I'd like to do that in my model. Plus there are other things I want to do using that method such as calculating age from DOB etc. Commented May 12, 2013 at 15:46
  • Oh, I think I see what you're after. You're looking for something like User::fullname($someusername) type thing right? Commented May 12, 2013 at 15:49
  • What I'm really after is a method where I don't have to do any more DB calls as the user object already exists. So a way in which i can access the current object's properties in a method of that object Commented May 12, 2013 at 16:07

2 Answers 2

8

You're almost there, you just need to remove the static from your code. Static methods operate on a class, not an object; so $this does not exist in static methods

public function fullname() {
    return $this->first_name . ' ' . $this->last_name;
}
Sign up to request clarification or add additional context in comments.

3 Comments

I like to use implode(' ', [$this->first_name, $this->last_name]); That way if either is ever blank there are no extra spaces
Neither first_name nor 'last_name' is a property of the class User. Still you can access them as they are database columns. 1) Unlike usual PHP classes, this is specific to Laravel, right ? 2) Where in Laravel doc is it said ?
Found it: laravel.com/docs/5.5/eloquent-mutators , take a look at getFullNameAttribute() function. still supported in Laravel 8.
3

In your user model, your static function can look something like this

public static function fullname($username) {
    $user = self::where_username($username)->first();

    return $user->first_name.' '.$user->last_name;
}

You can then call this anywhere in your views/controllers etc with User::fullname($someonesUsername)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.