J'ai un blog et je souhaite inclure le nom de l'utilisateur lorsqu'il est affiché au public.
Lors de la création du blog, je m'assure d'inclure le user_id dans le blogs table code>
Dans mon modèle de blog, j'ai les éléments suivants:
{{ $blogs->users->first_name }} {{ $blogs->users->last_name }}
Dans mon modèle d'utilisateurs, j'ai:
@foreach($blogs as $blog)
<h1>{{$blog->title}}</h1>
Source:{{$blog->users->first_name}} // This does not work
Source:{{$blog->first_name}} // This does not work either
@endforeach
Dans mon contrôleur de blog, j'ai:
public function index(User $user)
{
$users = User::get();
$blogs= DB::table('blogs')->where('user_id', '=', $users->id)->orderBy('id', 'DESC')->paginate(6);
return view('blogs.index',compact('blogs'));
}
Ensuite, à mon avis:
public function blogs()
{
return $this->hasMany(Blog::class);
}
Je pensais pouvoir faire quelque chose comme ça pour afficher les noms:
public function users()
{
return $this->belongsTo(User::class);
}
Mais cela ne fonctionne pas non plus ...
4 Réponses :
Dans votre contrôleur Blog, la variable $ blog doit être $ blogs . Vous avez également des caractères supplémentaires (parenthèse droite) dans votre Blade. Elle doit être:
public function index(User $user)
{
$blogs = Blog::where('user_id', '=', $user->id)->orderBy('created_at','desc')->paginate(6);
return view('blogs.index', compact('blogs'));
}
Modèle de blog
Cette fonction remplace l'ancienne fonction "utilisateurs", car un seul utilisateur est renvoyé (appartient à relation singulière).
public function blogs()
{
return $this->hasMany('App\Blog');
}
Modèle utilisateur
class Blog extends Model
{
public function user()
{
return $this->belongsTo('App\User');
}
}
Fonction du contrôleur
Et, en tant que tel, vous pouvez réduire le code de votre contrôleur, y compris la suppression des éléments redondants.
@foreach($blogs as $blog)
Source: {{ $blog->user->first_name }}
...
@endforeach
Essayez ceci:
public function user()
{
return $this->belongsTo(User::class);
}
Et sur votre modèle de blog
@foreach($blogs as $blog)
<h1>{{$blog->title}}</h1>
{{$blog->user->first_name}}
@endforeach
J'ai essayé cette solution, et celle ci-dessus, mais pas de chance. Je ne sais pas où je me trompe avec la relation User Blog , mais je ne parviens pas à obtenir l'auteur du blog avec uniquement le user_id dans le Tables de blogs. Une solution rapide serait d'ajouter le nom de l'auteur à la table du blog, mais je pense vraiment qu'il existe une meilleure solution.
Pouvez-vous me montrer votre migration? Les solutions ci-dessus auraient dû fonctionner. Et jetez un œil à la documentation laravel. com / docs / 5.7 / eloquent-relations # one-to-many
Je modifie ma solution, je réessaye. Cela fonctionnera probablement maintenant
La solution modifiée a fonctionné. Les utilisateurs doivent-ils être des utilisateurs car les utilisateurs sont un mot réservé? Juste curieux. Merci pour l'aide.
Oui, dans ce cas, la relation est nommée user () car le blog a un utilisateur (relation un à plusieurs (inverse)) et l'utilisateur a plusieurs blogs (relation un à plusieurs). Vous pouvez trouver plus d'informations à ce sujet dans le lien dans le commentaire ci-dessus. Heureux d'avoir pu aider :)
La façon dont vous l'avez fait s'appelle Query Builder
$blogs = DB::table('blogs')
->join('users', 'users.id', '=', 'blogs.user_id')
->get();
foreach($blogs as $blog){
dd($blog->first_name) // user first name
}
Query Builder ne prend pas en charge le chargement différé, car le chargement différé n'est pris en charge que pour la méthode Eloquent
$blogs = Blog::with('user')->where('user_id', $user->id)->get()
Quand je le fais de la manière éloquente comme vous l'expliquez, la page s'affiche, mais aucune donnée n'est ajoutée à la vue. J'obtiens Collection {# 888 ▼ #items: []} sur mon jj ($ blogs)
vous utilisez probablement $ users = User :: all () si vous voulez obtenir tout le blog, alors simplement $ blog = Blog :: all () puis
Je vois .. Cela fonctionne $ blogs = Blog :: orderBy ('created_at', 'desc') -> paginate (6); return view ('blogs.index', compact ('blogs'));
XXX
User.php public function blogs()
{
return $this->hasMany('App\Blog');
}
public function user()
{
return $this->belongsTo('App\User');
}