【问题标题】:Error: Invalid PathExpression. Must be a StateFieldPathExpression after select query via Doctrine错误:无效的路径表达式。通过 Doctrine 选择查询后必须是 StateFieldPathExpression
【发布时间】: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>

我尝试了所有方法(stackoverflow、google、自己的经验),但我真的不知道哪里有问题。有人可以向我解释这个错误或将我导航到正确的方式吗?谢谢。

我不想使用 IDENTITY 函数,因为我需要与外键关联的所有数据。 (Doctrine 自动选择这些对象,我认为这会产生错误,但为什么呢?)

使用:Symfony FW、Doctrine 2 ORM、MySQL

我的建议:

  1. 错误的 ORM 生成文件
  2. QueryBuilder 错误

【问题讨论】:

    标签: mysql database symfony orm doctrine


    【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 2016-03-28
        • 2023-03-25
        • 1970-01-01
        • 2012-12-22
        • 1970-01-01
        • 2014-02-01
        • 2014-02-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多