복붙노트

[SQL] 내부 사용 빌더 교리 쿼리 조건 가입

SQL

내부 사용 빌더 교리 쿼리 조건 가입

나는 교리의 쿼리 빌더를 사용하여 다음의 SQL을 구성하고 싶습니다 :

select c.*
from customer c
join phone p
on p.customer_id = c.id
and p.phone = :phone
where c.username = :username

우선 시도

$qb->select('c')
    ->innerJoin('c.phones', 'p', Join::ON, $qb->expr()->andx(
        $qb->expr()->eq('p.customerId', 'c.id'),
        $qb->expr()->eq('p.phone', ':phone')
    ))
    ->where('c.username = :username');

그러나 나는 다음과 같은 오류를 받고 있어요

Error: expected end of string, got 'ON'

그럼 난 시도

$qb->select('c')
    ->innerJoin('c.phones', 'p')
    ->where('c.username = :username')
    ->andWhere('p.phone = :phone');

이는 작동하는 것 같군. 그러나 사람이 첫 번째 시도 뭐가 잘못 알고 있나요? 나는 그것이 SQL은 어떻게 구성되어 있는지에 더 가깝게 유사 이래 처음 일을하고 싶습니다. 사전에 감사합니다!

참고 : 우리는 또한 교리와 기본 MySQL의 또는 DQL을 쓸 수 있습니다 알고,하지만 난 쿼리 빌더를 원합니다.

편집 : 아래의 전체 코드가

namespace Cyan\CustomerBundle\Repository;

use Cyan\CustomerBundle\Entity\Customer;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query\Expr\Join;

class CustomerRepository extends EntityRepository
{
    public function findCustomerByPhone($username, $phone)
    {
        $qb = $this->createQueryBuilder('c');

        $qb->select('c')
            ->innerJoin('c.phones', 'p', Join::ON, $qb->expr()->andx(
                $qb->expr()->eq('p.customerId', 'c.id'),
                $qb->expr()->eq('p.phone', ':phone')
            ))
            ->where('c.username = :username');

//        $qb->select('c')
//            ->innerJoin('c.phones', 'p')
//            ->where('c.username = :username')
//            ->andWhere('p.phone = :phone');

        $qb->setParameters(array(
            'username' => $username,
            'phone' => $phone->getPhone(),
        ));

        $query = $qb->getQuery();
        return $query->getResult();
    }
}

해결법

  1. ==============================

    1.나는 내 자신의 질문에 대답하는거야.

    나는 내 자신의 질문에 대답하는거야.

    따라서, 다음은 나를 위해 작동

    $qb->select('c')
        ->innerJoin('c.phones', 'p', 'WITH', 'p.phone = :phone')
        ->where('c.username = :username');
    

    또는

    $qb->select('c')
        ->innerJoin('c.phones', 'p', Join::WITH, $qb->expr()->eq('p.phone', ':phone'))
        ->where('c.username = :username');
    
  2. ==============================

    2.명시 적으로이 같은 가입 할 수 있습니다 :

    명시 적으로이 같은 가입 할 수 있습니다 :

    $qb->innerJoin('c.phones', 'p', Join::ON, 'c.id = p.customerId');
    

    하지만 당신은 교리에서 가입 클래스의 네임 스페이스를 사용합니다 :

    use Doctrine\ORM\Query\Expr\Join;
    

    또는 그렇게 선호하는 경우 :

    $qb->innerJoin('c.phones', 'p', Doctrine\ORM\Query\Expr\Join::ON, 'c.id = p.customerId');
    

    그렇지 않으면, 클래스가 발견되지 않고 스크립트가 충돌합니다 가입 ...

    innerJoin 방법의 다음 생성자 :

    public function innerJoin($join, $alias, $conditionType = null, $condition = null);
    

    현재 위치 (... 등, 그냥 "와 함께"또한 "ON"을 가입하지만) 다른 가능성을 찾을 수 있습니다 http://docs.doctrine-project.org/en/2.0.x/reference/query-builder를. HTML # 더 - EXPR 수준

    편집하다

    그것이해야한다고 생각 :

    $qb->select('c')
        ->innerJoin('c.phones', 'p', Join::ON, 'c.id = p.customerId')
        ->where('c.username = :username')
        ->andWhere('p.phone = :phone');
    
        $qb->setParameters(array(
            'username' => $username,
            'phone' => $phone->getPhone(),
        ));
    

    그렇지 않으면 당신이 ON과 함께, 아마도 문제의 혼합을 수행 생각합니다.

  3. from https://stackoverflow.com/questions/15377079/doctrine-query-builder-using-inner-join-with-conditions by cc-by-sa and MIT license