Php 从SQL到DQL

Php 从SQL到DQL,php,symfony,dql,Php,Symfony,Dql,我想更改此SQL查询:(我正在使用捆绑包) (Evenement是一个实体,Evenement_Evenement是Evenement多对多自引用的结果) 进入DQL。现在我有这个: public function findAllEventAssociateByEvent($idEvent){ $qb = $this->createQueryBuilder('e'); $qb->add('select', 'e'); $qb->from('Bundle:

我想更改此SQL查询:(我正在使用捆绑包) (Evenement是一个实体,Evenement_Evenement是Evenement多对多自引用的结果)

进入DQL。现在我有这个:

public function findAllEventAssociateByEvent($idEvent){
    $qb = $this->createQueryBuilder('e');
    $qb->add('select', 'e');
    $qb->from('Bundle:Evenement', 'e2');
    $qb->where('e = :evenement');
    $qb->andWhere('e2 in e.evenements');
    $qb->setParameter('evenement', $idEvent);
    return $qb;
    //select * from evenement e NATURAL join evenement_evenement ee where e.id = ee.evenement_source and e.id = $idEvent
}
$eventAssocies = $em->getRepository('Bundle:Evenement')->findAllEventAssociateByEvent($id)->getQuery()->getResult();
我有这个:

public function findAllEventAssociateByEvent($idEvent){
    $qb = $this->createQueryBuilder('e');
    $qb->add('select', 'e');
    $qb->from('Bundle:Evenement', 'e2');
    $qb->where('e = :evenement');
    $qb->andWhere('e2 in e.evenements');
    $qb->setParameter('evenement', $idEvent);
    return $qb;
    //select * from evenement e NATURAL join evenement_evenement ee where e.id = ee.evenement_source and e.id = $idEvent
}
$eventAssocies = $em->getRepository('Bundle:Evenement')->findAllEventAssociateByEvent($id)->getQuery()->getResult();

但它不起作用,我的“andWhere”中有一个错误,但我不知道为什么…

我想你误解了一些东西,我想你的查询应该更像这样:

public function findAllEventAssociateByEvent($idEvent){
    $qb = $this->createQueryBuilder('e')
       ->join('e.evenement_evenement', 'e2')
       ->where('e = :evenement')
       ->setParameter('evenement', $idEvent);
    return $qb;
}

加入将完成您试图使用
和where
所做的事情,我认为您不能使用
和where
这样,您必须像对待
where
子句一样对待它。声明一个参数,然后设置它。据我所知,您需要为
e.evements
部分使用子查询。无论您希望在
e.evements
部分中看到什么,都将其提取到变量中,例如:
$evements
,然后执行以下操作:

$qb->andWhere('e2 IN (:evenements)')
   ->setParameter('evenements', $evenements, Doctrine\DBAL\Connection::PARAM_INT_ARRAY);
假设
$evements
是一个数组。例如,如果它是一个字符串,您可以
explode()
it

如果您正在寻找快速解决方案,请尝试以下方法:

$qb = $this->createQueryBuilder('e')
           ->select('e.id')
           ->where('e.id = :evenement')
           ->setParameter('evenement', $idEvent);
 $evenementsIds = $qb->getQuery()->getResult(); // This will get you an array of ID's

$qb2 = $this->createQueryBuilder('e2')
            ->where('e2.id IN (:evenements)')
            ->setParameter('evenements', $evenementsIds, Doctrine\DBAL\Connection::PARAM_INT_ARRAY);

$result = $qb2->getQuery()->getResult();

“我有一个错误”是什么意思的可能重复?你有没有忘记分享的错误信息?是的,我做了一些研究,没有帮助。我对这段代码的错误是:[语法错误]第0行,第104列:错误:预期的条令\ORM\Query\Lexer::T_OPEN_括号,得到了“e”你能发布你的
evenement
entity类吗?我有这个查询和你的代码“从Bundle\entity\evenement e内部连接e.evenement e2其中e=:evenement”,我需要条件和错误:[语义错误]第0行,“e2,其中e=”附近的第69列:错误:Class Bundle\Entity\Evenment没有名为EvenElement的关联我假设您有一个由名为
Evenment
的字段映射的相关实体,但您必须适应您的情况。在相关字段上使用join将执行第二个条件
->join('e.relatingField'e2','WITH','e2.relatingField=id')
这就是它的意思什么是结果(你得到了什么)什么是好结果(你需要得到什么)?请仔细检查您的数据库中是否有内容。尝试使用MySQL客户端重新创建查询,以查看您是否实际使用了良好的参数进行查询。我得到1个结果,但我需要有2个结果(我必须在我的数据库中找到结果)在phpmyadmin中,我得到了两个结果:选择*from evenement e NATURAL join evenement_evenement ee,其中e.id=ee.evenement_source和e.id=1,其中1是1 evenement的id如果是这样的话,请仔细检查您的参数和数据库条目。我尽了最大努力使用DQL语法,因为您得到了'something',我认为您的问题是什么与错误相关的。现在,如果没有更多详细信息,我将无法告诉您参数和结果的情况。在我的数据库中:evenement:id,date…(使用我的实体evenement)evenement\u evenement=evenement\u origin,evenement\u target(使用多个实体从实体evenement生成)evenement和evenement_evenement是我数据库中的两个表