错误:无效的路径表达式。通过 Doctrine 选择查询后必须是 StateFieldPathExpression
Posted
技术标签:
【中文标题】错误:无效的路径表达式。通过 Doctrine 选择查询后必须是 StateFieldPathExpression【英文标题】:Error: Invalid PathExpression. Must be a StateFieldPathExpression after select query via Doctrine 【发布时间】:2018-03-19 17:33:52 【问题描述】: return $this->entityManager
->createQueryBuilder()
->select('cac.fkClient', 'cac.fkIndividualConsultation', 'cac.dateAdded', 'cac.fkWorker')
->from(ClientActivityIndividualConsultationHistory::class, 'cac')
->where('cac.dateAdded BETWEEN :startDate AND :endDate')
->andWhere('cac . fkWorker = :workerId')
->setParameters([
'startDate' => $dateStart,
'dateEnd' => $dateEnd,
'workerId' => $workerId
])
->getQuery()
->getArrayResult();
错误信息:
[语义错误] 'fkClient 附近的第 0 行,第 11 列, cac.fkIndividualConsultation,':错误:无效的 PathExpression。一定是 StateFieldPathExpression。
ORM:
<?xml version="1.0" encoding="utf-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
<entity name="Sepc\Bundle\WebBundle\Entity\ClientActivityIndividualConsultationHistory"
table="client_activity_individual_consultation_history">
<indexes>
<index name="fk_client_activity_individual_consulation_history_worker_id" columns="fk_worker_id"/>
<index name="fk_client_activity_individual_consulation_history_client_id" columns="fk_client_id"/>
<index name="fk_client_individual_consulation_history_consultation_id"
columns="fk_individual_consultation_id"/>
</indexes>
<id name="id" type="integer" column="id">
<generator strategy="IDENTITY"/>
</id>
<field name="dateAdded" type="datetime" column="date_added" nullable="false">
<options>
<option name="default">CURRENT_TIMESTAMP</option>
</options>
</field>
<many-to-one field="fkClient" target-entity="Client" fetch="LAZY">
<join-columns>
<join-column name="fk_client_id" referenced-column-name="id"/>
</join-columns>
</many-to-one>
<many-to-one field="fkWorker" target-entity="Worker" fetch="LAZY">
<join-columns>
<join-column name="fk_worker_id" referenced-column-name="id"/>
</join-columns>
</many-to-one>
<many-to-one field="fkIndividualConsultation" target-entity="CalendarIndividualConsultation" fetch="LAZY">
<join-columns>
<join-column name="fk_individual_consultation_id" referenced-column-name="id"/>
</join-columns>
</many-to-one>
</entity>
</doctrine-mapping>
我尝试了所有方法(***、google、自己的经验),但我真的不知道哪里有问题。有人可以向我解释这个错误或将我导航到正确的方式吗?谢谢。
我不想使用 IDENTITY 函数,因为我需要与外键关联的所有数据。 (Doctrine 自动选择这些对象,我认为这会产生错误,但为什么呢?)
使用:Symfony FW、Doctrine 2 ORM、mysql
我的建议:
-
错误的 ORM 生成文件
QueryBuilder 错误
【问题讨论】:
【参考方案1】:您应该加入与 fkClient、fkIndividualConsultation 和 fkWorker 关系以便选择它们。
所以改成:
->select('cac')
->from(ClientActivityIndividualConsultationHistory::class, 'cac')
->leftJoin('cac.fkIndividualConsultation', 'fkIndividualC')
->leftJoin('cac.fkClient', 'fkClient')
->leftJoin('cac.fkWorker', 'fkWorker')
【讨论】:
我做了这些改变。仍然无法正常工作......同样的错误 现在,没关系....但我需要更改 ->select('fkClient', 'fkIndividualC', 'cac.dateAdded', 'fkWorker') on ->select('cac ') 从数据库中选择所有数据。这不是好的模式。你总是会定义你需要的数据。谢谢简妮丝。 0 => array:2 [▼ "dateAdded" => DateTime #474 ▶ "id" => 1 ] 这是结果。未选择 FK 键。 FIXED 我使用了 ->getResult() 而不是 getArrayResult() 函数【参考方案2】: return $this->entityManager
->createQueryBuilder()
->select('cac')
->distinct('cac.fkClient')
->from(ClientActivityIndividualConsultationHistory::class, 'cac')
->where('cac.dateAdded BETWEEN :startDate AND :endDate')
->andWhere('cac . fkWorker = :workerId')
->setParameters([
'startDate' => $dateStart,
'endDate' => $dateEnd,
'workerId' => $workerId
])
->getQuery()
->getResult();
已修复。
使用 getResult() 函数代替 getArrayResult();
谢谢大家。
【讨论】:
【参考方案3】:您可以使用如下的用户选择语句:
SELECT IDENTITY(c.parent) ...
它将返回 ids,然后您可以使用 getResult() 方法中的对象对其进行水合,如下所示:
->getResult(AbstractQuery::HYDRATE_OBJECT);
【讨论】:
以上是关于错误:无效的路径表达式。通过 Doctrine 选择查询后必须是 StateFieldPathExpression的主要内容,如果未能解决你的问题,请参考以下文章
错误:无效的路径表达式。必须是 StateFieldPathExpression。