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 > 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 getNameAttribute()
{
return $this->details->name;
}
public function details()
{
return $this->hasOne(UserDetails::class, 'user_id', 'id');
}
3 Réponses :
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); }
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!
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
Merci mais j'en avais besoin dans le modèle lui-même pas dans le contrôleur.
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'); }
C'est utile, je pourrais l'utiliser comme Global scope et les données seront toujours disponibles pour $ user
@ bhoomi-patel merci pour les modifications :)