繁体   English   中英

如何在doctrine2 queryBuilder中实现ON(... OR ...)mysql查询

[英]How to implement ON ( … OR …) mysql query in doctrine2 queryBuilder

我在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;

在学说中我可以写这样的东西(来自我的工作代码):

$query = $em->getRepository('VplanningPageBundle:Storage')
            ->createQueryBuilder('s')
            ->innerJoin('s.city', 'c1')
            ->innerJoin('c1.area', 'c2')
            ->innerJoin('s.storagestype', 'st')
            ->where('c2.id = :cityID')
            ->andWhere('st.typename = :storagesTypeName')
            ->andWhere('s.active = :active')
            ->setParameters(array(
                'cityID' => $cityID,
                'storagesTypeName' => $storagesTypeName,
                'active' => 1
            ))
            ->orderBy('s.adress')
            ->getQuery();

如你所见,我展示了我的关系

->innerJoin('s.city', 'c1')

但我也需要关系

->innerJoin('s.city', 'c2')

有这个条件:

ON (s.city_id = c2.id OR s.city_id = c1.id)

但它抛出了这个错误:

错误:'c2'已定义

c1c2是同一个实体并且具有内在关系。

尝试这个:

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

试试这样的smth

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM