1
votes

Comment obtenir un avatar d'utilisateur lorsque je n'ai que le nom de l'utilisateur?

Je veux obtenir l'avatar des utilisateurs de ma table des utilisateurs lorsque je n'ai que le nom des utilisateurs de ma table des messages.

J'ai essayé de faire une boucle foreach comme celle-ci:

public function main_page()
{
   $posts = Post:all();

   foreach($posts as $post) {
     $user = User::where('name', $post->creator)->get();
   }

   return view('welcome')->with('posts', $posts)->with('user', $user);
}


0 commentaires

3 Réponses :


0
votes

Si vous connaissez sql, vous pouvez envoyer à la base de données quelque chose comme:

    SELECT avatar FROM users WHERE username="John_15";


2 commentaires

Suis-je sur le mauvais chemin ou ne fais pas User :: where ('nom', $ post-> creator) -> get (); le même? en plus de renvoyer un objet et pas seulement un avatar, mais c'est pareil si je me souviens correctement?


L'objet renvoyé contient-il le champ avatar?



1
votes

Vous remplacez la variable $ user pour chaque message. Enregistrez-le dans un tableau à la place:

@foreach($posts as $post)
    <span>{{ $post->user->avatar }}</span>
    <span>{{ $post->post_url }}</span>
@endforeach

Puis dans la vue:

   $posts = Post::with('user')->get();

   return view('welcome')->with('posts', $posts);

Mais une meilleure solution serait de sauvegarder le id de l'utilisateur dans la table posts , pas seulement le nom, et ajouter une relation . Le code serait alors:

@foreach($posts as $post)
    <span>{{ $users[$post->id]->avatar }}</span>
    <span>{{ $post->post_url }}</span>
@endforeach

with ('user') précharge la relation , pour ne pas générer trop de requêtes. Si vous n'avez besoin que de l'avatar, vous pouvez le rendre encore plus performant en utilisant à la place with ('user: avatar') .

La vue ressemblerait alors à ceci :

   $posts = Post::all();
   $users = [];

   foreach($posts as $post) {
     $users[$post->id] = User::where('name', $post->creator)->get();
   }

   return view('welcome')->with('posts', $posts)->with('users', $users);


16 commentaires

Merci pour votre réponse détaillée. Je suis assez nouveau dans laravel et j'ai essayé d'ajouter une relation à mon modèle d'utilisateur comme ceci: public function avatar () {return $ this-> belongsTo ('name', 'avatar'); } mais j'obtiens une erreur appelée Appel à la méthode non définie Illuminate \ Database \ Eloquent \ Builder :: all () qu'est-ce que je fais de mal?


Heureux d'aider. Vous avez besoin d'une relation user () sur la classe Post . Vous pouvez prendre l'exemple de la documentation et remplacer Publier avec Utilisateur et Commentaire avec Post .


Ou vous pouvez le faire par nom comme dans votre question mise à jour. :-) Mais vous devez également définir la relation inverse sur le modèle Post .


Merci! J'ai déjà une relation user () sur mon modèle Post qui retourne return $ this-> belongsTo (User :: class); est-ce correct?


Cela me semble correct. Sachez simplement que cela générera une erreur s'il n'y a pas d'utilisateur avec le nom défini (par exemple, si l'utilisateur l'a changé). Pour éviter cela, vous pouvez soit utiliser optionnel ($ post-> user) -> avatar (n'imprimera rien si l'utilisateur n'est pas trouvé) ou en définissant la relation avec l'ID.


J'utilise l'id maintenant, je ne devrais pas avoir de problèmes avec ça, je pense :) Mais toujours mon problème avec Call to undefined method Illuminate \ Database \ Eloquent \ Builder :: all () persiste. Dois-je définir le constructeur quelque part?


Je viens de découvrir que vous avez une faute de frappe dans Post: all () : il devrait y avoir deux deux points Post :: all () .


Ah, ma faute. Il est censé être Post :: with ('user') -> get () pas all () . Mettra à jour ma réponse.


Maintenant, j'essaye d'obtenir la propriété d'un non-objet quand j'utilise $ post-> user-> avatar .. c'est bizarre, j'ai déjà essayé des choses similaires avant, je suppose que c'était $ post-> creator-> avatar qui n'a pas fonctionné non plus.


Avez-vous déjà ajouté un champ creator_id ou user_id à la table posts ? Et pouvez-vous mettre à jour la question avec la nouvelle relation?


au lieu du nom dans le champ de mon créateur, c'est juste l'identifiant de l'utilisateur qui est inséré maintenant. mettra à jour la question.


Par défaut, Laravel recherche une colonne {{MODEL}} _ id dans le tableau (dans ce cas, user_id ). Pour remplacer le nom de colonne correct: $ this-> appartient à (User :: class, 'creator');


ooh, cela a du sens. mais j'obtiens toujours la même erreur. la solution est probablement assez simple mais je n'arrive toujours pas à la comprendre. désolé d'avoir tant demandé, et je suis vraiment reconnaissant de m'avoir aidé ici! :)


Qu'est-ce que post-> user si vous ajoutez dd ($ posts) au contrôleur?


Vous voulez probablement la partie relation, à l'intérieur se trouve ceci: #relations: array: 1 [▼ "user" => null]


Je l'ai! J'ai dû lancer php artisan migrate: refresh car j'avais un message dont le nom était dans le champ créateur, pas l'ID de l'utilisateur. Maintenant, cela fonctionne correctement, aucune erreur et mon image s'affiche. Hou la la! Merci pour votre aide, je l'apprécie vraiment. Passez une bonne journée! :)