Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get Nested json array of data Laravel Eloquent model with Relationship

I am making social network using laravel where I want to show " 'post' 'comments' 'comment_by' user info in single array with nested relationship

Here is my class and database structure

table name and Fields

Members

         ID => primary key,
         name,
         email

Posts

         ID => primary key,
         postText
         fromUserId => foreign key (Members-id)

Comments

         commentText ,
         onPostId = > foreign key (Post-id)
         fromUserId = > foreign key (Members-id)

Eloquent Models

  1. Member.php

    class Member extends Model { // }

  2. Post.php

    class post extends Model { // public $timestamps = true;

    function getUserDetails() { return $this->belongsTo('App\Member', 'fromUserId', 'id'); }

    function getCommentDetails() { return $this->hasMany('App\comment', 'onPostId', 'id'); }

    }

3.Comment.php

class comment extends Model
  {


  }

call for getting array

 $posts=post::with('getUserDetails','getCommentDetails')->get();

*expected output

{  
   "id":1,
   "postType":1,
   "postText":"my name is parth",
   "url":null,
   "likesCount":0,
   "unlikesCount":0,
   "shareCount":0,
   "commentsCount":0,
   "thumbUrl":null,
   "accessMode":1,
   "fromUserId":1,
   "isAdult":1,
   "created_at":null,
   "updated_at":null,
   "get_user_details":{  
      "id":1,
      "name":"parth",
      "email":"[email protected]",
      "password":"parth123456",
      "remember_token":"e1b28a30ab467c52924df64034c386d4",
      "created_at":null,
      "updated_at":null
   },
   "get_comment_details":[  
      {  
         "id":1,
         "commentsText":"dccd",
         "onPostId":1,
         "fromUserId":1,
         "created_at":"2017-05-25 16:44:51",
         "updated_at":null
         "commented_by":{  
               "id":1,
               "name":"parth",
               "email":"[email protected]",
               "password":"parth123456",
               "remember_token":"e1b28a30ab467c52924df64034c386d4",
               "created_at":null,
               "updated_at":null
             },
      },
      {  
         "id":3,
         "commentsText":"second comment",
         "onPostId":1,
         "fromUserId":1,
         "created_at":"2017-05-26 09:40:51",
         "updated_at":null
         "commented_by":{  
               "id":1,
               "name":"parth",
               "email":"[email protected]",
               "password":"parth123456",
               "remember_token":"e1b28a30ab467c52924df64034c386d4",
               "created_at":null,
               "updated_at":null
             },
      },
      {  
         "id":4,
         "commentsText":"second comment",
         "onPostId":1,
         "fromUserId":1,
         "created_at":"2017-05-26 09:41:16",
         "updated_at":null
         "commented_by":{  
               "id":1,
               "name":"parth",
               "email":"[email protected]",
               "password":"parth123456",
               "remember_token":"e1b28a30ab467c52924df64034c386d4",
               "created_at":null,
               "updated_at":null
             },
      },
      {  
         "id":5,
         "commentsText":"third one",
         "onPostId":1,
         "fromUserId":1,
         "created_at":"2017-05-26 09:41:43",
         "updated_at":null
         "commented_by":{  
               "id":1,
               "name":"parth",
               "email":"[email protected]",
               "password":"parth123456",
               "remember_token":"e1b28a30ab467c52924df64034c386d4",
               "created_at":null,
               "updated_at":null
             },
      }
   ]
}
like image 747
Parth Bhatti Avatar asked Oct 29 '22 07:10

Parth Bhatti


1 Answers

Based on your comment, just add the commentedBy relationship to your Member model and eager load it.

In Comment model.

public function commentedBy()
{
    return $this->belongsTo('App\Member', 'fromUserId', 'id');
}

Then eager load the relationship like so.

$posts = post::with('getUserDetails','getCommentDetails.commentedBy')->get();
like image 189
Sandeesh Avatar answered Nov 15 '22 07:11

Sandeesh