Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在doctrine2querybuilder中实现(…或…)mysql查询_Mysql_Symfony_Doctrine Orm - Fatal编程技术网

如何在doctrine2querybuilder中实现(…或…)mysql查询

如何在doctrine2querybuilder中实现(…或…)mysql查询,mysql,symfony,doctrine-orm,Mysql,Symfony,Doctrine Orm,我在MYSQL中有一个SQL查询: 比如说 SELECT s.* FROM vplanning.cities as c1 INNER JOIN vplanning.cities as c2 ON (c1.id = c2.area_id) INNER JOIN vplanning.storages as s ON (s.city_id = c2.id OR s.city_id = c1.id) WHERE c1.id = 109; 在理论中,我可以这样写(从我的工作代码): 正如你所看到的,我在

我在MYSQL中有一个SQL查询: 比如说

SELECT s.* FROM vplanning.cities as c1
INNER JOIN vplanning.cities as c2
ON (c1.id = c2.area_id)
INNER JOIN vplanning.storages as s
ON (s.city_id = c2.id OR s.city_id = c1.id)
WHERE c1.id = 109;
在理论中,我可以这样写(从我的工作代码):

正如你所看到的,我在照片中展示了我的关系

->innerJoin('s.city', 'c1')
但我也需要这样的关系

->innerJoin('s.city', 'c2')
在这种情况下:

ON (s.city_id = c2.id OR s.city_id = c1.id)
但它抛出了一个错误:

错误:“c2”已定义

c1
c2
是同一个实体,有着内在的联系。

试试这个:

$repository = $em->getRepository('VplanningPageBundle:Storage');
$qb = $repository->createQueryBuilder('storage');
//We can now use the expr()
$qb->join('storage.city', 'city', Join::WITH)
   ->join('city.area', 'area', Join::WITH, $qb->expr()->eq('area.id', ':cityID'))
   ->join('storage.storagestype', 'type', Join::WITH, $qb->expr()->eq('type.typename', ':storagesTypeName'))
   ->where('storage.active = :active')
   ->setParameters(array(
       'cityID' => $cityID,
       'storagesTypeName' => $storagesTypeName,
       'active' => 1
   ))
   ->orderBy('storage.adress');
$query = $qb->getQuery();
像这样试试看

$qb = $this->getRepository('VplanningPageBundle:City')->createQueryBuilder('c');
$qb->leftJoin('c.area', 'a')
    ->join('c.storage', 's', Join::ON, $qb->expr()->orX($qb->expr()->eq('c.id', 's.id'), $qb->expr()->eq('a.id', 's.id')))
    ->innerJoin('s.storagestype', 'st')
    ->where('c.id = :cityID')
    ->andWhere('st.typename = :storagesTypeName')
    ->andWhere('s.active = :active')
    ->setParameters(array(
       'cityID' => $cityID,
       'storagesTypeName' => $storagesTypeName,
       'active' => 1,
    ))
    ->orderBy('s.adress')
    ->getQuery()
;

这个问题的解决非常困难,对我来说,我必须学习:)

以下是我在某论坛上提出的问题的答案:

$qb = $em->getRepository('VplanningPageBundle:Storage')->createQueryBuilder('storage');
            $query = $qb->join('storage.city', 'city1', Join::WITH)
                ->leftJoin('city1.area', 'area', Join::WITH, $qb->expr()->eq('area.id', ':cityID'))
                ->leftJoin('storage.city', 'city2', Join::WITH, $qb->expr()->eq('city2.id', ':cityID'))
                ->join('storage.storagestype', 'type', Join::WITH, $qb->expr()->eq('type.typename', ':storagesTypeName'))
                ->where('storage.active = :active')
                ->andWhere($qb->expr()->orX($qb->expr()->isNotNull('city2'), $qb->expr()->isNotNull('area')))
                ->setParameters(array(
                'cityID' => $cityID,
                'storagesTypeName' => $storagesTypeName,
                'active' => 1
            ))
                ->orderBy('storage.adress')
            ->getQuery();

我认为更好的选择应该是使用..我考虑过这种方法,这似乎是唯一正确的方法。我的结果和以前一样,但你的代码对我来说是新的,我会和他一起玩。谢谢。谢谢你的回答,它抛出了一个
[Syntax Error]行0,第92列:错误:预期字符串结束,得到了“ON”
,但我认为你给了我一个想法,是时候阅读文档了:)但我认为这实际上是更复杂的sql请求。
$qb = $em->getRepository('VplanningPageBundle:Storage')->createQueryBuilder('storage');
            $query = $qb->join('storage.city', 'city1', Join::WITH)
                ->leftJoin('city1.area', 'area', Join::WITH, $qb->expr()->eq('area.id', ':cityID'))
                ->leftJoin('storage.city', 'city2', Join::WITH, $qb->expr()->eq('city2.id', ':cityID'))
                ->join('storage.storagestype', 'type', Join::WITH, $qb->expr()->eq('type.typename', ':storagesTypeName'))
                ->where('storage.active = :active')
                ->andWhere($qb->expr()->orX($qb->expr()->isNotNull('city2'), $qb->expr()->isNotNull('area')))
                ->setParameters(array(
                'cityID' => $cityID,
                'storagesTypeName' => $storagesTypeName,
                'active' => 1
            ))
                ->orderBy('storage.adress')
            ->getQuery();