2014-12-05 53 views
1

我想爲以下MySQL查詢生成一個DQL:doctrine dql異常:非法偏移類型在/var/www/Symfony/vendor/doctrine/orm/lib/Doctrine/ORM/Query/SqlWalker.php第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中正常工作,並返回正確的記錄。
要生成DQL我都試過以下選項:

$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(); 

在我的角度來看,似乎確定,但我不知道爲什麼在兩種方式中它產生以下例外:

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,並把它在我的第二DQL裏面notIn部分,這將導致警告消息,我執行第一個查詢並得到結果,然後把結果如果返回值的數量大於1,則返回notIn,否則應該使用常規的!=。這解決了我現在的問題,但正如你所看到的交易量現在增加了
如果任何人有更好的解決方案或對警告的任何修復,我會感激。

1

我遇到了同樣的錯誤,它似乎已被修正在Doctrine/ORM的最新主幹中。
在您的composer.json中使用「2.5.*@dev」作爲doctrine/orm版本應該修復此錯誤,並且可以讓您在單個查詢中執行所需的操作。

相關問題