2012-07-05 4 views
1

은 무엇 난 후 것은 DQL에서 다음 SQL 쿼리이 SQL을 DQL로 작성하는 방법은 무엇입니까?

SELECT p.* 
    FROM player p 
WHERE CONCAT(p.first_name, ' ', p.last_name) = ? 

입니다. 내가 지금까지 가지고있는 것은

$qb->add('select', 'p') 
    ->add('from', 'VNNCoreBundle:Player p') 
    ->add('where', $qb->expr()->eq(
     $qb->expr()->concat('p.firstName', $qb->expr()->concat(' ', 'p.lastName')), 
     ':name' 
    )) 
    ->setParameters(array('name' => $name)); 

이다.하지만 그건 틀린 문제입니다.

나는 항상 네이티브 SQL로 내 레코드의 ID를 얻을 수 있다는 것을 알고 있으며, Doctrine으로 레코드를 얻으려면 findOneById()을 수행하십시오. 한편으로는, 그 일을하는 데는 괴롭 히거나 해킹하는 것처럼 느껴진다. 반면에, DQL이 형성되지 않기 때문에 직선 SQL에서 간단한 쿼리가 될 일을하기 위해 DQL에서하는 일이 멍청하다고 느낀다. 매우 우아합니다. 어쨌든, 나는이 많은 시간을 그것에 넣었으며, 이제는 DQL에 올바른 방법이 무엇인지 궁금합니다.

답변

2

native SQL 경로가 종료되었습니다. 나는 세 번째 옵션을 잊어 버렸습니다.

$rsm = new ResultSetMapping; 
$rsm->addEntityResult('Player', 'p'); 
$rsm->addFieldResult('p', 'id', 'player_id'); 
$rsm->addFieldResult('p', 'name', 'name'); 

$sql = " 
    SELECT p.* 
     FROM players p 
    WHERE CONCAT(p.first_name, ' ', p.last_name) = ? 
"; 

$query = $this->getEntityManager()->createNativeQuery($sql, $rsm); 
$query->setParameter(1, $name); 
관련 문제