2
votes

Comment créer une relation entre l'utilisateur et les messages dans Laravel

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 ...


0 commentaires

4 Réponses :


2
votes

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


0 commentaires

2
votes

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


5 commentaires

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 :)



1
votes

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()


3 commentaires

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'));



1
votes

XXX

public function blogs()
{
    return $this->hasMany('App\Blog');
}

User.php

public function user()
    {
        return $this->belongsTo('App\User');
    }


0 commentaires