web-dev-qa-db-ja.com

「無効なPathExpression。StateFieldPathExpressionである必要があります」クエリビルダーの関連しないエンティティ

OfficialDocumentMediaNMediaStatusNMediaTypeの4つのエンティティがあります。私はこのSQLを翻訳しようとしています:

SELECT od.media, od.type, od.status, md.url, nms.name 
    FROM official_document od 
    LEFT JOIN media md ON od.media = md.id 
    LEFT JOIN n_media_status nms ON od.status = nms.id
    WHERE od.company = 9 

to Doctrine Query Builderとこれが結果です:

public function findOfficialDocument($company_id) {
    $qb = $this->getEntityManager()->createQueryBuilder();

    $qb->select('od.media', 'od.type', 'od.status', 'md.url', 'nms.name', 'nmt.name');
    $qb->from('Company\RegisterCompanyBundle\Entity\OfficialDocument', 'od');
    $qb->leftJoin('Common\MediaBundle\Entity\Media', 'md', \Doctrine\ORM\Query\Expr\Join::WITH, 'od.media = md.id');
    $qb->leftJoin('Common\MediaBundle\Entity\NMediaStatus', 'nms', \Doctrine\ORM\Query\Expr\Join::WITH, 'od.status = nms.id');
    $qb->leftJoin('Common\MediaBundle\Entity\NMediaType', 'nmt', \Doctrine\ORM\Query\Expr\Join::WITH, 'od.type = nmt.id');

    $qb->where('od.company = ?1');
    $qb->setParameter(1, $company_id);

    return $qb->getQuery()->getResult();
}

しかし、コントローラーから関数を呼び出すと、このエラーが発生します。

[セマンティックエラー]行0、 'media、od.type、'付近の列10:エラー:無効なPathExpression。 StateFieldPathExpressionである必要があります。

[1/2] QueryException:SELECT od.media、od.type、od.status、md.url、nms.name、nmt.name FROM Company\RegisterCompanyBundle\Entity\OfficialDocument od LEFT JOIN Common\MediaBundle\Entity\Media md WITH od.media = md.id LEJ JOIN Common\MediaBundle\Entity\NMediaStatus nms WITH od.status = nms.id LEOJOIN Common\MediaBundle\Entity\NMediaType nmt WITH od.type = nmt.id WHERE od.company =?1

OfficialDocumentは他の3つのエンティティに関連していますが、これらのエンティティにreversedByは必要ないので、これがエラーの原因であるかどうかはわかりません。とにかく、この問題を解決するためのアドバイスやヘルプはありますか?

PS:ここでエンティティを見る必要がある場合、最新のSymfony2とDoctrine2を使用しています: OfficialDocumentMediaNMediaStatusNMediaType

19
ReynierPM

それを修正する方法を見つけたので、私は自分自身に答えます:

$qb->select('IDENTITY(od.media)', 'IDENTITY(od.type) AS doc_type', 'IDENTITY(od.status) AS doc_status', 'md.url', 'nms.name', 'nmt.name');

od.mediaod.typeod.statusは複合キーです。クエリを機能させて問題を修正するには、IDENTITYを追加する必要があります

60
ReynierPM

単純に、複合キーが存在する()を使用できます。

$qb->select('(od.media)', '(od.type) AS doc_type', '(od.status) AS doc_status', 'md.url', 'nms.name', 'nmt.name');
20
TRiNE