错误:无效的路径表达式。通过 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。

Doctrine DQL:如何使表达式反转

RangeError,语法错误:无效的正则表达式

尝试通过 XCode 上传二进制文件时出现“无效的图像路径”错误

Symfony 和 Doctrine 使迁移无效

带有绑定参数的大型查询会导致Doctrine中的参数编号错误