일반 SQL과 다른 동작 :각 질문에 관련된 나는 질문의 테이블과 답변 (결과)의 테이블이 심포니 응용 프로그램이
id | answer_text | question_id | user_id
----------------------------------------
1 | John | 1 | 10
2 | Peter | 1 | 11
3 | 24 | 2 | 10
사용자는 질문을 건너 뛸 수 있으므로 답변 테이블의 해당 질문에 대해 일치하는 대답이 아닐 수도 있습니다. 그러나 주어진 사용자에 대한 결과를 검색 할 때 모든 질문과 관련 응답 또는 null이 포함 된 포괄적 인 목록이 필요합니다.
SELECT question_text, answer_text FROM `question` left join result on question.id = result.question_id and user_id=10
저를 가져옵니다 :
question_text | answer_text
----------------------------------------
Name? | Peter
Age? | null
내가 기대 그냥 일 : USER_ID (11)에 대한
question_text | answer_text
----------------------------------------
Name? | John
Age? | 24
,이처럼 보이는 그래서 (일반 SQL에서) 나는이 같은 가입 떠났다.
이 쿼리를 dql 쿼리로 변환하려고하면 문제가 발생합니다. 이런 일을하고있는 임 :
$qb->select('q.question_title, r.answer_text');
$qb->from('AppBundle:Question', 'q');
$qb->leftJoin(
'AppBundle:Result',
'r',
\Doctrine\ORM\Query\Expr\Join::WITH,
'q.id = r.question'
);
$qb->where('r.user = '.$user->getId());
$answer= $qb->getQuery()->getResult();
조인의 오른쪽에 일치하는 데이터가있는 데이터 세트의 경우 제대로 작동합니다. 그러나 오른쪽이 null이면 반환 된 배열에서 getResult가 제거됩니다. 위의 첫 번째 예제는 일반 SQL에서 덤프됩니다.
array:2 [
0 => array:2 [
"question_title" => Name?
"answer_text" => "John"
]
1 => array:2 [
"question_title" => Age?
"answer_text" => "24"
]
]
그리고 두 번째 예제의 덤프입니다. 이 일치하는 대답은없고, 내가 한 요소에 불과 배열을 얻을 :
array:2 [
0 => array:2 [
"question_title" => Name?
"answer_text" => "Peter"
]
]
내가 일반 SQL에 참여 왼쪽으로 얻을 정확한 동작을 모방 할 수있는 방법이 있다면 나도 몰라합니다.
메신저 데이터베이스 엔진이 mysql을 사용하는 방식에 차이가 나는 경우를 대비하여.
EDIT : 실제로 묻는 질문이 없습니다 Doctrine2 LEFT JOIN with 2 conditions. DQL과 SQL에서 동일한 쿼리가 다르게 동작한다고 생각했습니다. 내가 번역을 망쳤다는 것이 드러났다.
가능한 복제 [Doctrine2 LEFT 가입 수행하는 것보다 당신의 엔티티에 정의 된 매핑을 가지고 2 가지 조건으로 JOIN] (https://stackoverflow.com/questions/15815869/doctrine2-left-join-with-2-conditions) 이것은 분명히 기본적입니다. 당신은 무엇을 찾았습니까? ? – philipxy
그건 내가 묻고있는 것이 아니 었습니다. DQL에서 다르게 동작하는 SQL의 쿼리가 있다고 생각했지만 실제로 아래 번역 된 사용자가 잘못 번역했습니다. –
그 질문에 (* (가난한) 제목에도 불구하고) * 묻는 질문은 결과가 어떤 'join'과 'where'에 주어진 특정 방식으로 잘못된 이유입니다. 따라서 질문의 합리적인 특성화는 당신의 상황을 포함합니다. 그 질문에서 * 대답하는 것은 asker가'on '에 그것을 필요로 할 때'where'에 잘못 조건을 넣는 것입니다. 그것이 귀하의 질문에 대한 답변입니다. 또한 다른 많은 히트작들과 유사하며 히트 곡도 있습니다. 나는 * 내가 찾은 * Google이 준 응답. 그래서 ... – philipxy