2017-08-05 3 views
1

Voici ma structure de table:Comment puis-je obtenir le nom de l'auteur des commentaires?

-- users 
+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | John | 
| 2 | Jack | 
| 3 | Peter | 
+----+-------+ 

-- posts 
+----+---------+----------------------+-----------+ 
| id | title |   body   | author_id | 
+----+---------+----------------------+-----------| 
| 1 | title1 | somthing    | 2   | 
| 2 | title2 | whatever    | 1   | 
| 3 | title3 | anything    | 3   | 
+----+---------+----------------------+-----------+ 

-- comments 
+----+-----------------+---------+-----------+ 
| id |  message  | post_id | author_id | 
+----+-----------------+---------+-----------+ 
| 1 | my message  | 3  | 2   | 
| 2 | whatever  | 1  | 3   | 
+----+-----------------+---------+-----------+ 

Maintenant, je veux obtenir un poste avec tous ses commentaires. Voici mon code:

$post= Posts::orderBy('id', 'DESC')->where('id', $request->id)->first(); 
    $comments = $post->comments; 

A pris note que j'ai cette relation dans le modèle User:

public function comments() 
{ 
    return $this->hasMany('App\Comments','post_id', 'id')->orderBy('id'); 
} 

Quelle est ma question? Je veux aussi connaître le nom de l'auteur des commentaires. Je veux dire le nom de la personne qui a écrit le commentaire. de toute façon, comment puis-je faire une relation sur une relation existante?

Note: Je peux faire cela par un JOIN brut. Mais je veux savoir comment puis-je faire cela par les relations Laravel?

Répondre

5

pourquoi vous définissez relation avec task_id?

dans le modèle utilisateur:

public function comments() 
{ 
    return $this->hasMany('App\Comments','author_id', 'id'); 
} 

et dans le modèle de commentaire:

/** 
* comments belongs to a user. 
*/ 
public function user() 
{ 
    return $this->belongsTo('App\User', 'author_id', 'id'); 
} 

maintenant vous pouvez obtenir un utilisateur avec des commentaires

User::where("id",$userId)->with("comments")->orderBy('id', 'DESC')->get(); 

si vous voulez obtenir après avec tous les commentaires vous devriez définir une relation comme celle-ci pour le modèle de poste.

dans le modèle posts définissent une relation:

public function comments() 
{ 
    return $this->hasMany('App\Comments','post_id', 'id'); 
} 

et dans le modèle de commentaires:

/** 
* comments belongs to a post. 
*/ 
public function post() 
{ 
    return $this->belongsTo('App\Posts', 'post_id', 'id'); 
} 

maintenant:

Posts::where("id",$postId)->with("comments")->orderBy('id', 'DESC')->get(); 
+0

Désolé pour 'task_id', c'était une faute de frappe, eidted. –

+0

thx, upvote ..! –

+0

juste une question, n'y at-il pas d'autre moyen au lieu de 'with()'? –

2

Vous pouvez joindre les deux tables comme celui-ci

DB::table('comments') 
    ->join('users', function ($join) { 
    $join->on('comments.author_id', '=', 'users.id'); 
    }) 
    ->get(); 

https://laravel.com/docs/5.4/queries#joins

+0

thx, upvote ..! –