Doctrine DBAL 参数不起作用

Posted

技术标签:

【中文标题】Doctrine DBAL 参数不起作用【英文标题】:Doctrine DBAL parameters not working 【发布时间】:2016-06-21 10:00:26 【问题描述】:

您好,我正在将 php Silex 与 Doctrine DBAL 查询构建器(无 ORM)和 SQLite 一起使用。它有点工作,所以我可以构建一个查询并吐回结果,但我这辈子我无法让设置参数工作(我总是得到空数组)。

以下是有效的:

$qb->select('*')
            ->from('photos')
            ->where("country = '".$country."'")
            ->andWhere('status = 1')
            ->orderBy($sort[0], $sort[1])
            ->setFirstResult($start)
            ->setMaxResults($limit)

出于显而易见的原因,我想将其替换为:

$qb->select('*')
            ->from('photos')
            ->where("country = ?") /// <--
            ->andWhere('status = 1')
            ->orderBy($sort[0], $sort[1])
            ->setFirstResult($start)
            ->setMaxResults($limit)
            ->setParameter(0, $country) /// <--

或者:

$qb->select('*')
            ->from('photos')
            ->where("country = :country") /// <--
            ->andWhere('status = 1')
            ->orderBy($sort[0], $sort[1])
            ->setFirstResult($start)
            ->setMaxResults($limit)
            ->setParameter(':country', $country) /// <--

甚至:

$qb = $this->db->createQueryBuilder(); 
$expr = $qb->expr();
$qb->select('*')
            ->from('photos')
            ->where($qb->expr()->andX(
                $qb->expr()->eq('country', '?1'), /// <--
                $qb->expr()->eq('status', 1)
            ))
            ->orderBy($sort[0], $sort[1])
            ->setFirstResult($start)
            ->setMaxResults($limit)
            ->setParameter(1, $country) /// <--

这些都是我在文档中找到的设置参数的示例,但是它们似乎都不起作用,我不知道如何调试它。检查 $qb->getSQL() 和 $qb->getParams() 似乎没有任何用处。

如果这很重要,我会使用("doctrine/dbal": "~2.2")

【问题讨论】:

您能否详细说明“似乎不起作用”,没有返回结果? 没错。没有错误。只是清空结果数组。第一种方式按预期返回行。只是显示的变化。 你试过-&gt;setParameter('country', $country)(不带冒号) 没有。那么我应该如何在 where() 方法中声明参数呢?有没有冒号? -&gt;where("country = :country")-&gt;setParameter('country', $country) 【参考方案1】:

我偶然回到自己的问题,因为我很久以前就解决了它,当然结果证明这是一件愚蠢的事情。问题不在于正确构建查询,而是以正确的方式使用它。这是答案以供将来参考。

使用查询生成器,您不会这样做:

$this->db->fetchAll($qb->getSQL()); 
// you get query with unfilled placeholders

而是:

$qb->execute()->fetchAll();

感谢所有试图提供帮助的人!

【讨论】:

请将您自己的问题标记为正确。它只是照亮了我在周日下午阴沉的发展。

以上是关于Doctrine DBAL 参数不起作用的主要内容,如果未能解决你的问题,请参考以下文章

DISTINCT声明在Doctrine中不起作用

Doctrine ORM CLI 工具不起作用

为啥这个 Doctrine OneToOne 自引用双向关联不起作用?

Doctrine ORM ManyToOne Inverse 不起作用

Doctrine2.3 和 OneToOne 级联持续似乎不起作用

Symfony 3 - Doctrine 2 - 在 oneToMany 关系上的 orderBy 不起作用