4
votes

Existe-t-il un moyen d'accéder aux attributs de relation en tant que propres dans le modèle laravel?

J'ai 2 tables: users et users_details

- users a 3 colonnes [id , nom d'utilisateur, mot de passe]

- users_details a [id, user_id, name, address]

J'ai des modèles pour chacun d'eux avec une relation entre users et users_details. p >

    public function getNameAttribute()
    {
        return $this->details->name;
    }

Ma question vient ici: existe-t-il un moyen d'accéder aux attributs UsersDetails en tant qu'utilisateur uniquement.

par exemple: {{$ user-> name}} : {{$ user-> address}} au lieu de {{$ user-> details-> name}}: {{$ user-> details-> address}}

Gardez à l'esprit que ces tableaux ne sont que des exemples et n'ont pas leur vraie gamme de colonnes. J'en ai besoin pour implémenter Laravel / Cashier mais ce plugin a besoin de 4 nouvelles colonnes dans la table [users] et je veux les mettre dans la table [users_details].

Je n'ai rien essayé car je ne l'ai pas vraiment savoir si c'est possible. Sauf pour le moment, la seule solution de contournement que je connaisse est de créer la méthode getNameAttribute dans User:

    public function details()
    {
        return $this->hasOne(UserDetails::class, 'user_id', 'id');
    }


1 commentaires

@ bhoomi-patel merci pour les modifications :)


3 Réponses :


3
votes

Je ne suis pas sûr de le recommander car il ajoutera simplement de la magie à la façon dont les choses fonctionnent et pourrait être difficile à comprendre dans 6 mois.

Mais vous pourriez faire quelque chose comme ça dans votre modèle utilisateur.

Modifié

public function getAttribute($key)
{
    // If attribute exists on the user, return that
    return parent::getAttribute($key)
        // otherwise fallback to details attribute
        ?? optional($this->details)->getAttribute($key);
}


1 commentaires

Laravel est tellement plein de magie que je ne suis pas sûr que cela ajoute une confusion notable. Documentez vos modèles et vous devriez être d'accord. Belle solution btw!



3
votes

oui. vous pouvez le faire dans le contrôleur avant de passer $ user à votre vue. comme ceci.

{{ $user->details_table_field }}

puis vous passez le $ user à votre vue comme ceci:

return view('your_view' , compact('user'));

puis dans votre vue utilise le code suivant:

$user->load('details');

vous pouvez effectuer une recherche sur le chargement hâtif: https://laravel.com/docs/5.7/eloquent-relationships#eager- chargement


1 commentaires

Merci mais j'en avais besoin dans le modèle lui-même pas dans le contrôleur.



2
votes

Je pense qu'utiliser Laravel Query Builder et Laravel Scope est également une autre option dans ce problème.

Pour ce faire, vous devez ajouter la ligne de codes suivante.

Dans votre modèle utilisateur:

 @foreach ($users as $user)
      {{ $user->name }} : {{ $user->address }}
 @endforeach

Dans votre contrôleur:

$users = User::userDetails()->all(); #get all users
//dd($users); #dumping results
return view("view_file", compact('users')); #passing data to view

Dans votre vue Blade Fichier:

public function scopeUserDetails($query){
    return $query->join('users_details', 'users.id', '=', 'users_details.user_id');
}


1 commentaires

C'est utile, je pourrais l'utiliser comme Global scope et les données seront toujours disponibles pour $ user