2017-10-15 2 views
1

안녕하세요. 많은 사용자 데이터가 여러 모델에 걸쳐 별도의 테이블에 저장되는 Laravel의 응용 프로그램이 있습니다. 이제 다양한 데이터를 날짜별로 정렬하는 작업 피드를 만드는 요구 사항이 있습니다.Laravel Eloquent 활동 피드에 대한 쿼리 조합

두 개의 모델, CommentLike이 있다고 가정합니다.

두 날짜를 모두 결합하는 피드를 원합니다. merge()은 같은 id을 가질 수 있기 때문에 옵션이 아닙니다.

따라서 나는 UNION 일 수 있지만 내 문제는 무엇이 무엇으로부터 왔는지를 알 수 없다는 것입니다.

내 좋아하는 테이블은 다음과 같습니다

+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| user_id | int(11)   | NO |  | NULL |    | 
| asset_id | int(11)   | NO |  | NULL |    | 
| created_at | timestamp  | YES |  | NULL |    | 
| updated_at | timestamp  | YES |  | NULL |    | 
+------------+------------------+------+-----+---------+----------------+ 

내 의견 테이블은 다음과 같습니다

난 그냥 조합 두 쿼리, 나는 그들이 다른 알고 만한다면
+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| id   | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| asset_id | int(11)   | NO |  | NULL |    | 
| content | longtext   | NO |  | NULL |    | 
| user_id | int(11)   | NO |  | NULL |    | 
| created_at | timestamp  | YES |  | NULL |    | 
| updated_at | timestamp  | YES |  | NULL |    | 
+------------+------------------+------+-----+---------+----------------+ 

내 문제는 다른 모델 (예 : Blurb 또는 기타)에있을 수있는 content 열의 존재를 기반으로합니다. 속 직선 무엇을 유지하면서 기본적으로

, 어떻게 모델에서 여러 쿼리를 얻는 곳, 내 활동 피드에 나는 등

I, 당신은 당신이 좋아하는 분 전, 논평 분 전,하고 싶은 말 때문에 비효율 때문에 여러 쿼리를 수행하고 싶지 않고 모든 작업 (좋아요 및 주석 등)을 하나의 테이블에 저장하고 싶지 않습니다. 거기에 사용할 수있는 일종의 별칭 대신 열의 이름을 바꾸려면 쿼리의 목적을 위해 쿼리를 사용하여 데이터를 삽입합니다. 예를 들어, 주석 선택은 임시 필드에 "주석"을 추가하여 내가 좋아할 수 있도록합니다

$data->type? 모든 테이블에 유형을 넣을 수는 있지만 공간이 불필요하게 차지하게 될 것입니다. 분명히 알 수있는 것은 주석이 주석 테이블에있을 때 그 것이 유일한 유일한 쿼리 일 때입니다. 그러나 이제는 내 생각을 다시 생각합니다. 구조 주어진 여러 테이블에 걸쳐 하나의 쿼리가 필요합니다.

+0

좋아요와 댓글의 관계를 만들었습니까? – usrNotFound

+0

@usrNotFound 아니요 ...해야하나요? –

+0

사용자가 댓글을 좋아하는지 어떻게 알 수 있습니까? 나는 사용자가 볼 수 있지만 어떻게 주석을 집어 넣을까요? – usrNotFound

답변

1

: (안된)

SELECT likes.*, '' AS content, 'like' AS type 
FROM likes 
WHERE likes.user_id = 1 
UNION 
SELECT comments.*, 'comment' AS type 
FROM comments 
WHERE likes.user_id = 1 
ORDER BY created_at DESC 

Laravel 코드처럼 보일 것입니다.

$userId = Auth::id(); //or whatever you want. 
    $activity = DB::table('comment as ac') 
    ->select(DB::raw('ac.user_id , ac.asset_id , ac.comment , ac.created_at , ac.updated_at , "comment" as activity_type')) 
    ->where("ac.user_id", $userId) 
    ->union(
    DB::table('like as al') 
    ->select(DB::raw('al.user_id , al.asset_id , NULL as comment , al.created_at , al.updated_at , "like" as activity_type')) 
    ->where("al.user_id", $userId) 
    ) 
    ->latest() 
    ->get(); 
+1

도움을 주셔서 감사합니다 답변 Sachin, 정말 고마워요 :) –

+0

환영합니다 - @AkshayPrabhakar –

1

쿼리를 수행 할 때 테이블 이름을 기반으로 추가 원시 값을 선택하십시오. 예를 들어, 원시 SQL에서 : 당신은 사용자 활동 피드를 얻기 위해 다음과 같은 코드를 사용할 수 있습니다

$activity = DB::table('comments') 
    ->select("comments.*, 'comment' AS type") 
    ->where('comments.user_id', $user->id) 
    ->union(
     DB::table('likes') 
      ->select("likes.*, '' AS content, 'like' AS type") 
      ->where('likes.user_id', $user->id) 
    ) 
    ->orderBy('created_at', 'ASC') 
    ->get();