In Laravel 9 I use Blade and Spatie´s Permisisons for authorisation. In addition I redirect admins to other Controllers / Layouts / Views than I redirect normal users to.
With that approach I use the users
table for both, admins and users. But users have a second table called clients
with special normal user´s attributes. The Client
model has a function to get the user attributes.
public function login()
{
return $this->belongsTo('App\Models\User', 'login');
}
With that I am able to display the client's email address using {{$client->login->email}}
.
But I want to use {{$client->email}}
instead and I don't want to store the email address in clients
and users
table.
Now I created a custom method
public function email()
{
$this->login()->first()->email;
}
and I can use it with {{$client->email()}}
but what do I need to do, to be able to access it with {{$client->email}}
?
CodePudding user response:
You're very close actually. Notice how you're using:
{{ $client->login->email }}
That same syntax can be used inside the model, but replace $client
with $this
:
public function email() {
return $this->login->email;
}
Now, you can call:
{{ $client->email() }}
but $client->email
(without the ()
) will not work, as this is a Method, not a property.
For that, use an Accessor:
public function getEmailAttribute() {
return $this->login->email;
}
The code get{Whatever}Attribute()
will convert the method whatever()
to a property whatever
, and now you can call:
{{ $client->email }}
Full documentation can be found here:
https://laravel.com/docs/9.x/eloquent-mutators
Edit:
Since your model already has a login
column, use a different name for your relationship:
public function loginUser() {
return $this->belongsTo(User::class, 'login');
}
And now call:
// In your view:
{{ $client->loginUser->email }}
{{ $client->loginUser()->first()->email }}
// ... etc.
// In your `Client.php` model:
$this->loginUser->email;
$this->loginUser()->first()->email;
/// ... etc.
Or refactor your clients
table to use a more sensical column name, such as user_id
, login_id
, etc. Whatever gets you the end result you need