简体   繁体   中英

How To use Eloquent in From One Model to another model through intermediate table

i have three models

Article

id 
title 

Comment

id
title
user_id
article_id

User

id 
name

what i wanna achieve is to select one article based on its id with comments and user info that made that comment

like that :

$article = Article::find($id -- say 1)->with('comments' -- this is a relation in Article Model)->get(); 

this gives me article with related comments as an array of objects say comment one - comment two etc ....

what i want instead of user_id in comment object i wanna it to be a user object

see this pic thats what i reached so far

我所做的屏幕

using laravel 5.4

You can use following:

$articles = Article::find($id)->with('comments', 'comments.user')->get();

Here 'user' is the relationship you mentioned in the comments model for User.

If you have defined the foreign key relationship in Schemas, you can define functions for Eloquent Relationship as defined in following reference link - Laravel - Eloquent Relationships .

You can define functions in models as follows -

Article -

  class Article extends Model
  {
     ...

     public function comments(){

         // Accessing comments posted to that article.

         return $this->hasMany(\App\Comment::class);
     }

     // Create a foreign key to refer the user who created the article. I've referred it here as 'created_by'. That would keep relationship circle complete. You may ignore it if you want.

     public define user(){

         // Accessing user who posted the article

         return $this->hasOne(\App\User::class, 'id', 'created_by');
     }
  }

Comment -

  class Comment extends Model
  {
     ...

     public function article(){

         // Accessing article to which the particular comment was posted

         return $this->hasOne(\App\Article::class, 'id', 'article_id');
     }

     public function user(){

         // Accessing user who posted the comment

         return $this->hasOne(\App\User::class, 'id', 'user_id');
     }
  }

User -

  class User extends Models
  {
     ...

     public function articles(){

         // Accessing articles posted by a user

         return $this->hasMany(\App\Article::class);
     }

     public function comments(){

         // Accessing comments posted by a user

         return $this->hasMany(\App\Comment::class);
     }
  }

Now you can use like following -

   $article = Article::findOrFail($id);
   $comments = $article->comments;
   $article_user = $article->user;
   $comment_user = Comment::findOrFail($commnet_id)->user;
   $users_comments = User::findOrFail($user_id)->comments;
   $users_articles = User::findOrFail($user_id)->articles;

and so on...

It is far better to use ->find() at last instead of ->get() because get() returns a Collection.

This way you will get a single object which you want instead of a Collection.

For example:

$commentableObj = Post::with(['comments'])
                  ->withCount(['comments'])
                  ->findOrFail($commentable->id);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM