使用错误表别名生成查询的学说

Posted

技术标签:

【中文标题】使用错误表别名生成查询的学说【英文标题】:Doctrine generating query with wrong table alias 【发布时间】:2015-10-01 14:11:19 【问题描述】:

我正在尝试使用教义/orm 2.5.1 做一个简单的->find()

查询很简单:

$this->get('order_repository')->find(10);

但这会产生一个复杂的查询:

SELECT s0_.number AS number_0, s0_.state AS state_1, s0_.completed_at AS completed_at_2, s0_.items_total AS items_total_3, s0_.adjustments_total ASadjustments_total_4, s0_.total AS total_5, s0_.created_at AS created_at_6, s0_.updated_at AS updated_at_7, s0_.deleted_at AS deleted_at_8, s0_.id AS id_9, s0_.expires_at AS expires_at_10, s1_.currency AS currency_11, s1_.checkout_state AS checkout_state_12, s1_.payment_state AS payment_state_13, s1_.shipping_state AS shipping_state_14, s2_.quantity AS s2_.unit_price AS unit_price_16, s2_.adjustments_total AS adjust_total_17, s2_.total AS total_18, s2_.is_immutable AS is_immutable_19, s2_.id AS id_20, s1_.channel_id AS channel_id_21, s1_.shipping_address_id AS shipping_address_id_22, s1_.billing_ customer_id AS customer_id_24, s1_.offer_id AS offer_id_25, s2_.order_id AS order_id_26, s2_.variant_id AS variant_id_27 FROM sylius_order s1_ LEFT JOIN sylius_order_item s2_ ON s1_.id = s 2_.order_id WHERE (s1_.id = 10) AND (s1_.deleted_at IS NULL)'

出现以下错误:

SQLSTATE[42S22]:未找到列:1054 '字段列表'中的未知列 's0_.number'

我可以看到 s0_ 没有在查询的任何地方定义。这些别名是从教义中自动生成的,我只是不明白为什么它使用 s0_ 然后将其跳到 FROM 上的 s1_ 上,其中包含 s0_ 上提到的列。*

【问题讨论】:

你能说明order_repository的定义吗?也尝试清除缓存doctrine:cache:clear-metadata doctrine:cache:clear-query 【参考方案1】:

我刚刚在同样的问题上花了一个小时;你可能犯了和我一样的打字错误。

对我来说,问题出在.yml 架构定义中。在我定义表之间关系的部分中,我有这个目标实体:

targetEntity: mlEmailNotif

而不是

targetEntity: MlEmailNotif

所以小写的 'm' 使教义为新表创建一个新别名(php 比较区分大小写)。

【讨论】:

圣鼹鼠。如果没有此评论,我不确定我是否会找到此消息的来源。非常感谢!如果区分大小写会引发致命错误,您会认为 Doctrine 在检查架构时可能会引发验证错误。【参考方案2】:

问题出在:SELECT s0_.number as number_0 - 似乎未定义列号或映射(注释、yml、php)和架构(mysql)之间存在差异。

如果你运行 php app/console dictionary:schema:update --dump-sql 是否有任何 SQL 命令?如果是,则必须根据映射的实体更新架构。

【讨论】:

以上是关于使用错误表别名生成查询的学说的主要内容,如果未能解决你的问题,请参考以下文章

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

错误代码:1248。每个派生表都必须有自己的别名 没有找到查询的解决方案

学说查询的语法错误 (Symfony2)

Doctrine2:[语义错误] 不能通过标识变量选择实体而不选择至少一个根实体别名

#1066 - 错误不是唯一的表别名

带有别名的 SUM() 字段上的学说 orderBy