Doctrine DBAL 查询生成器上缺少 insert() 方法

Posted

技术标签:

【中文标题】Doctrine DBAL 查询生成器上缺少 insert() 方法【英文标题】:Missing insert() method on Doctrine DBAL Query Builder 【发布时间】:2014-10-15 18:21:09 【问题描述】:

我觉得我在这里错过了一些小东西;我在 Dotrine DBAL 2.2.x / 2.3.x 的 QueryBuilder 组件上使用 insert() 方法时遇到问题。

我做了一些调查,这是来自QueryBuilder page from the DBAL Documantation的sn-p

\Doctrine\DBAL\Query\QueryBuilder 支持构建 SELECT、INSERT、UPDATE 和 DELETE 查询。您正在构建哪种查询取决于您使用的方法。

继续解释代码示例,这样我就可以简单地做:

$builder = $connection->createQueryBuilder();
$result = $builder
    ->insert('table_name')
    // ...

插入模式下使用查询生成器。除非我这样做了,否则我会在这里收到来自 php 的投诉:

致命错误:调用未定义的方法 Doctrine\DBAL\Query\QueryBuilder::insert()

在进一步检查The QueryBuilder.php Source Code

我没有看到对任何方法 insert(...) 的引用,没有可以从其继承的类,没有添加到 QueryBuilder 的特征可能会暴露插入机制。此外,我在顶部看到了这个:

/* The query types. */
const SELECT = 0;
const DELETE = 1;
const UPDATE = 2;

没有插入查询类型;然而,execute() 有这个有趣的方法评论:

/**
 * Execute this query using the bound parameters and their types.
 *
 * Uses @see Connection::executeQuery for select statements and @see Connection::executeUpdate
 * for insert, update and delete statements.
 *
 * @return mixed
 */

底线:

这是一个拥有 100 名维护人员的大型项目,我更有可能在这里找到我的解释可疑之处,而不是在众多版本中搞砸了如此基本的东西,但我终其一生都无法弄清楚我错过了什么. 请帮我看清楚。

【问题讨论】:

我得出了与您完全相同的结论,显然我们没有搞砸任何事情:)。只需等待 Doctrine/DBAL v2.5 的稳定版本,一切都会好起来的。好消息是它仍然可以与 PHP 5.3 一起使用,这对于升级最棘手的生产环境来说是个好消息。 【参考方案1】:

这取决于您的版本。自 v2.5.0-BETA3 起添加了插入功能。

即https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Query/QueryBuilder.php#L563 和commit

您可以决定更新软件包版本或check this alternative solution

【讨论】:

这很奇怪,因为他们的 2.1 -> 2.4 文档似乎表明该功能应该存在,但事实并非如此。如果可能的话,我想使用一个稳定的版本。 也许创建者虽然已经稳定,或者文档中的“最新”表示开发版本(因为该页面没有其他版本)。我在the commit 下写了对这个问题的参考以找出答案。 如果我单击 2.1 的文档,它会将我带到“最新” 没有办法查看特定版本的文档。我刚刚证实了这一点,这可能就是它如此令人困惑的原因。 即answer from Doctrine collaborator。这很混乱,事情就是这样。他还指向存储库,您可以在其中尝试查找错误。 只是注意到 DBAL 现在位于 RC1

以上是关于Doctrine DBAL 查询生成器上缺少 insert() 方法的主要内容,如果未能解决你的问题,请参考以下文章

学说:ORM QueryBuilder 或 DBAL QueryBuilder

避免使用Doctrine DBAL查询构建器select语句将驼峰别名名称转换为小写

执行多个查询时的 Doctrine (DBAL) 错误处理

PostgreSQL 咨询锁不适用于 Doctrine 的 DBAL

Doctrine DBAL 参数不起作用

Doctrine DBAL 可以与 ORM Query Builder 混合使用吗?