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语句将驼峰别名名称转换为小写