2014-12-05 10 views
1

:교리 DQL 예외 : /var/www/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php 라인에서 불법 오프셋 타입 I는 MySQL의 쿼리 다음에 대한 DQL을 생산하려면 601

SELECT * FROM `folders` AS `t` WHERE `t`.`Library` = @myLib AND AND `t`.`Id` NOT IN (
    SELECT DISTINCT(`f`.`Id`) FROM `folders` AS `f` JOIN `folders` AS `ff` ON (`f`.`Position` LIKE CONCAT(`ff`.`Position`, '%')) WHERE `ff`.`Active` = 1 AND `ff`.`Library` = @myLib AND `f`.`Library` = @myLib 
) 
ORDER BY `t`.`Position` ASC 

쿼리가 mySQL에서 올바르게 작동하고 올바른 레코드를 반환합니다. 내 관점에서
1

$query = $em->createQuery("SELECT F FROM MyBundle:Folders T WHERE T.Library = :libid AND T.id NOT IN (
     SELECT DISTINCT(F.id) FROM MyBundle:Folders F JOIN MyBundle:Folders FF WITH F.Position LIKE CONCAT(FF.Position, '%') AND F.Library = :libid AND FF.Library = :libid AND FF.Active = true 
    ) ORDER BY T.Position ASC") 
     ->setParameter('libid', $library); 
$result = $query->getResult(); 

2

$q1 = $this->createQueryBuilder('F') 
     ->select('DISTINCT(F.id)'); 
$q1->join('\MyBundle\Entity\Folders', 'FF', 'WITH', $q1->expr()->like('F.Position', $q1->expr()->literal('CONCAT(FF.Position, \'%\')'))) 
    ->where('FF.Active = true') 
    ->andWhere("FF.Library = '$library'") 
    ->andWhere("F.Library = '$library'"); 

$q2 = $this->createQueryBuilder('T'); 
$q2->where('T.Library = :libid') 
    ->andWhere($q2->expr()->notIn('T.id', $q1->getDQL())) 
    ->setParameter('libid', $library) 
    ->orderBy('T.Position', 'ASC'); 
$result = $q2->getQuery()->getResult(); 

가 확인을 보인다하지만 난 이유를 알고하지 않습니다
내가 노력 두 옵션 아래 한 DQL를 생성하려면 두 가지면에서 다음 예외를 생성합니다.

ContextErrorException: Warning: Illegal offset type in 
/var/www/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php line 601 

도움이 될 것입니다.

답변

1

아무도 대답이없는 것 같습니다. 나는 다음과 같은 임시 솔루션을 발견했다. (임시 쿼리는 두 개의 개별 쿼리로 내 고유 쿼리를 변경하기 때문에 임시로 호출한다. 문제는 교리의 핵심이다.)

$qb = $this->createQueryBuilder('F') 
    ->select('DISTINCT(F.id)'); 
$qb->join('\MyBundle\Entity\Folders', 'FF', 'WITH', 'F.Position LIKE CONCAT(FF.Position, \'%\')') 
    ->where('FF.Active = true') 
    ->andWhere("FF.Library = :library") 
    ->andWhere("F.Library = :library") 
    ->setParameter('library', $library); 

$included_folders = $qb->getQuery()->getArrayResult(); 

$query = $this->createQueryBuilder('F') 
    ->where('F.Active = false') 
    ->andWhere('F.Library = :library') 
    ->setParameter('library', $library) 
    ->orderBy('F.Position', 'ASC'); 
if (!empty($included_folders)) { 
    if (count($included_folders) > 1) 
    { 
     foreach ($included_folders as $index => $value) 
     { 
      if (is_array($value)) 
      { 
       $included_folders[$index] = !empty($value['id']) ? $value['id'] : $value[1]; 
      } 
     } 
     $query->andWhere($query->expr()->notIn('F.id', $included_folders)); 
    } 
    else { 
     $query->andWhere('F.id != :folder ') 
      ->setParameter('folder', $included_folders[0]); 
    } 
} 
$result = $query->getQuery()->getResult(); 

대신 내 첫 번째 쿼리에서 DQL를 받고 경고 메시지로 이어질 것입니다 notIn 섹션에서 내 두 번째 DQL 내부 퍼팅으로 볼 때, 나는 첫 번째 쿼리를 실행하고 결과는 다음 결과를 넣을 수 반환되는 값의 양이 1보다 큰 경우 notIn 안에, 그렇지 않으면 정규 !=이어야합니다. 지금 당장 내 문제가 해결되었지만 거래량이 늘어났습니다.
경고에 대한 해결책이나 수정 사항이있는 사람이 있으면 감사 할 것입니다.

1

동일한 오류가 발생하여 Doctrine/ORM의 최신 트렁크에서 수정 된 것으로 보입니다.
doctrine/orm 용 composer.json의 버전으로 "2.5.*@dev"를 사용하면이 버그가 수정되어 단일 쿼리에서 원하는 작업을 수행 할 수 있습니다.