2014-02-22 1 views
0

내 상태 게시물에 대해 다음 데이터베이스를 설정했습니다. 각 게시물에 대해 사용자는 게시물을 좋아하거나 게시물에 댓글을 달거나 작성자가 원래 게시물에 태그 할 수 있습니다.소셜 네트워크 용 Laravel Eloquent ORM

Resourceful 컨트롤러 'Post'를 설정하여 JSON 객체를 통해 모든 데이터를 다시 가져 오려고하지만 댓글, 좋아요 또는 태그 사용자 이름을 제대로 찾을 수 없습니다. 나는 그것이 차이를 만드는 경우 인증을 위해 Sentry 2를 사용하고 있습니다.

가 여기에 데이터베이스 설정입니다 :

CREATE TABLE Users (
     id INT NOT NULL AUTO_INCREMENT, 
     first_name VARCHAR(30), 
     last_name VARCHAR(30), 
     many more... 
    ); 

    CREATE TABLE Posts (
     postID INT NOT NULL AUTO_INCREMENT, 
     caption VARCHAR(200), 
     description VARCHAR(200), 
     fromID INT(10) UNSIGNED NOT NULL, 
     toID INT(10) UNSIGNED NOT NULL, 
     icon VARCHAR(200), 
     link VARCHAR(200), 
     message TEXT, 
     storyType INT, 
     type ENUM ('LINK', 'PHOTO', 'STATUSUPDATE', 'VIDEO'), 
     createdTime DATE, 
     PRIMARY KEY (postID), 
     FOREIGN KEY (fromID) REFERENCES users (id), 
     FOREIGN KEY (toID) REFERENCES users (id) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

    CREATE TABLE Likes (
     likeID INT NOT NULL AUTO_INCREMENT, 
     fromID INT(10) UNSIGNED NOT NULL, 
     postID INT NOT NULL, 
     createdDate DATE, 
     PRIMARY KEY (likeID), 
     FOREIGN KEY (fromID) REFERENCES users (id), 
     FOREIGN KEY (postID) REFERENCES Posts (postID) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

    CREATE TABLE Comments (
     commentID INT NOT NULL AUTO_INCREMENT, 
     fromID INT(10) UNSIGNED NOT NULL, 
     postID INT NOT NULL, 
     comment TEXT, 
     createdDate DATE, 
     PRIMARY KEY (commentID), 
     FOREIGN KEY (fromID) REFERENCES users (id), 
     FOREIGN KEY (postID) REFERENCES Posts (postID) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 


    CREATE TABLE Tags (
     tagID INT NOT NULL AUTO_INCREMENT, 
     userID INT(10) UNSIGNED NOT NULL, 
     postID INT NOT NULL, 
     PRIMARY KEY (tagID), 
     FOREIGN KEY (userID) REFERENCES users (id), 
     FOREIGN KEY (postID) REFERENCES Posts (postID) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

내 게시물 컨트롤러, 난 그냥 모든 것을 뱉어 간단한 페이지가 있습니다. 내 뷰 파일에서 아무 것도 반복하지 않고 그냥 json 전체 개체를 가져오고 싶습니다.

class PostController extends BaseController { 

    public function show($id) 
    { 
    $post = Post::with(array('comments', 'from', 'tags', 'likes'))->find($id); 
    return View::make('samplepage')->with('data', $post); 
    } 
} 

내 포스트 모델 :

class Post extends Eloquent { 

    protected $table = 'Posts'; 
    protected $primaryKey = 'postID'; 

    public function comments() 
    { 
     return $this->hasMany('Comment','postID'); 
    } 

    public function tags() 
    { 
     return $this->hasMany('Tag','postID'); 
    } 

    public function likes() 
    { 
     return $this->hasMany('Like','postID'); 
    } 


    public function from() 
    { 
     return $this->belongsTo('User', 'fromID')->select(array('id', 'first_name', 'last_name')); 
    } 

    public function users() 
    { 
     return $this->belongsTo('User', 'fromID'); 
    } 

} 

코멘트 모델 : 클래스 의견이 설득력을 확장 {

protected $table = 'Comments'; 
    protected $primaryKey = 'commentID'; 

    public function post() { 
     return $this->belongsTo('Post','fromID'); 
    } 

    public function user() { 
     return $this->belongsTo('User', 'fromID')->select(array('id', 'first_name', 'last_name')); 
    } 
} 

태그 모델 : 클래스 태그는 {

protected $table = 'Tags'; 
    protected $primaryKey = 'tagID'; 

} 
,369 설득력을 확장

내 사용자 모델에서도 다음과 같은 설정을했지만 차이는 없습니다. 사용자 모델 :

public function posts() { 
    return $this->hasMany('Post','id'); 
} 

public function comments() { 
return $this->hasMany('Comment','id'); 
} 

모두가이 설정으로 위대한 작품을 내가 게시물을 쳤을 때 /이 다음 코드로 2, 나는 다시 아래의 객체를 얻는다. $ post = Post (배열 ('comments', 'from', 'tags', 'likes')) -> 찾기 ($ id); 보기 :: make ('samplepage') -> with ('data', $ post);

{ 
    postID: "2", 
    toID: "8", 
    comments: [ 
     { 
     commentID: "2", 
     comment: "second comment", 
     fromID: "1", 
     postID: "2", 
     createdDate: "2014-02-15" 
     } 
    ], 
    from: { 
     id: "4", 
     first_name: Paul, 
     last_name: Davis 
    }, 
    tags: [ 
     { 
     tagID: "1", 
     userID: "2", 
     postID: "2" 
     }, 
     { 
     tagID: "2", 
     userID: "3", 
     postID: "2" 
     } 
    ], 
    likes: [ 
     { 
     likeID: "1", 
     fromID: "2", 
     postID: "2", 
     createdDate: "2013-01-04" 
     }, 
     { 
     likeID: "2", 
     fromID: "3", 
     postID: "2", 
     createdDate: "2013-02-05" 
     } 
    ] 
} 

는하지만 내가 원하는 곳에 각 태그처럼, 다음이며, 이름과 성을 연결하고 다시 객체를 얻기 위해 언급.

{ 
    postID: "2", 
    toID: "4", 
    comments: [ 
     { 
     commentID: "2", 
     comment: "second comment", 
     fromID: "1", 
     from: { 
       "name": "Jason Terry", 
       "id": "721286625" 
      }, 
     postID: "2", 
     createdDate: "2014-02-15" 
     } 
    ], 
    from: { 
     id: "4", 
     first_name: Paul, 
     last_name: Davis 
    }, 
    tags: [ 
     { 
     tagID: "1", 
     userID: "2", 
     from: { 
       "name": "David Lee", 
       "id": "721286625" 
      }, 
     postID: "2" 
     }, 
     { 
     tagID: "2", 
     userID: "3", 
     from: { 
       "name": "Paul Pierce", 
       "id": "721286625" 
      }, 
     postID: "2" 
     } 
    ], 
    likes: [ 
     { 
     likeID: "1", 
     fromID: "2", 
     from: { 
       "name": "David Lee", 
       "id": "721286625" 
      }, 
     postID: "2", 
     createdDate: "2013-01-04" 
     }, 
     { 
     likeID: "2", 
     fromID: "3", 
     from: { 
       "name": "Al Davis", 
       "id": "721286625" 
      }, 
     postID: "2", 
     createdDate: "2013-02-05" 
     } 
    ] 
} 

Stackoverflow, 무수한 Laravel 블로그, 2 주 동안 공식 문서를 검색했으며이를 해결할 수 없습니다. 어떤 도움을 주셔서 감사합니다.

업데이트 : 토니의 대답은 내가 코멘트, 태그에

public function users() 
{ return $this->belongsTo('User', 'fromID')->select(array('id', 'first_name', 'last_name')); 
} 

을 추가 한 다음
$post = Post::with(array('comments.users', 'from', 'tags.users', 'likes.users'))->find($id); 

을 추가하고, 모델을 좋아 아래. 그리고 그 목적은 지금 위대한 작품입니다.

하지만 내 디버거는 한마디로 다음과 같은

select `id`, `first_name`, `last_name` from `users` where `users`.`id` in ('1') 

select `id`, `first_name`, `last_name` from `users` where `users`.`id` in ('4') 

select `id`, `first_name`, `last_name` from `users` where `users`.`id` in ('2', '3') 

select `id`, `first_name`, `last_name` from `users` where `users`.`id` in ('2', '3') 

을 보여줍니다, 그것은 내 사용자 테이블에 4 개 쿼리를 실행합니다. 이것은 중복되지 않습니까? 원래 게시 사용자에 대한 쿼리 1 개, 주석 사용자에 대한 쿼리 1 개, 태그 사용자에 대한 쿼리 1 개, 사용자 likes 사용자에 대한 쿼리 1 개 대신 사용자 테이블에 대해 1 개의 쿼리를 수행하면 안됩니까?

답변

3

중첩 된 관계를 사용하려는 것 같습니다.

$post = Post::with('comments.from', 'from', 'tags.from', 'likes.from')->find($id); 

또한 각 모델에 "from"관계가 코딩되어 있어야합니다.

연결된 이름을 가져 오려면; 당신은 당신의 사용자 모델

protected $appends = array('name'); 
protected $hidden = array('first_name', 'last_name'); //this is optional 

public function getNameAttribute() 
{ 
    return $this->attributes['first_name'] . ' ' . $this->attributes['last_name']; 
} 
+0

안녕 토니에 다음을 필요 했어, 내가 추가 $ 포스트 = 포스트 ::와 (array ('comments.users', 'from', 'tags', 'likes')) -> find ($ id); 단지 코멘트로 테스트하기. 그런 다음 추가했습니다. public function users() { return $ this-> belongsTo ('User', 'fromID') -> select (array ('id', 'first_name', 'last_name'))); } 댓글 모델에. 그리고 그 대상은 훌륭하게 작동합니다. 하지만 내 디버거는'('1')에'users'.'id'이 'id'을 선택할 경우 다음 이 users''에서'id','first_name','last_name'을 선택 first_name'을 보여줍니다 , 'last_name' from'users' 어디에서'users'.id'('4') users 테이블에 2 db 호출을하는 것이 중복되지 않습니까? – user1011713

+0

덧글 모델에 대해서는 2 개의 코멘트에 대해 다음과 같이 나타낼 수는 없지만 : '사용자'의'id','first_name','last_name'을'users'.id' in '('1 ','3 ') 그렇게 큰 작품. – user1011713

+0

@ user1011713 괜찮으 시다면이 정보로 원래 게시물을 편집하면 더 쉽게 읽을 수 있습니다. 네가 무엇을 요구하는지 모르겠다. – TonyArra

0

가 조금 오래된 게시물입니다하지만 당신은 또한이 작업을 수행 할 수

public function from() 
    { 
     return $this->belongsTo('User', 'fromID') 
        ->select(array('id',DB::raw("CONCAT(firstname,' ', lastname) as name"))); 
    }