1

MySQL データベースに doctrine2 の問題があります。

私はモデルUserとモデルを持っていDocumentsます。それぞれUser0 または n を持つことができますDocuments。それぞれDocumentが正確に 1 つの に割り当てられUserます。私のモデル:

ユーザー

<?php

namespace Entity;

/**
* @Entity(repositoryClass="Entity\Repository\UserRepository")
* @Table(name="user")
*/
class User extends Object
{
    /**
    * @Id @GeneratedValue(strategy="UUID")
    * @Column(type="string", length=36)
    * @var string
    */
    protected $id;

    /**
    * @OneToMany(targetEntity="\Entity\Document", mappedBy="user")
    */
    private $documents;

    public function __construct($options = array())
    {
        $this->documents = new \Doctrine\Common\Collections\ArrayCollection;
    }
}

書類

<?php

namespace Entity;

/**
* @Entity(repositoryClass="Entity\Repository\DocumentRepository")
* @Table(name="document")
*/
class Document extends Object
{
    /**
    * @Id @Column(type="string")
    * @var string
    */
    protected $id;

    /**
    * @ManyToOne(targetEntity="\Entity\User", inversedBy="documents")
    * @JoinColumn(name="user_id", referencedColumnName="id")
    * @var User
    */
    private $user;
}

User今、私は与えられたDocumentIDのを取得したい. SQL クエリは次のようになります。

SELECT u.*
FROM `user` u
INNER JOIN `document` d ON d.user_id = u.id
WHERE d.id = 'mydocumentid'

しかし、これは機能しません:

$user = $queryBuilder
        ->select('u.*')
        ->from('\\Entity\\User', 'u')
        ->innerJoin('\\Entity\\Document', 'd', \Doctrine\ORM\Query\Expr\Join::ON, 'd.user_id = u.id')
        ->where('d.id = :documentId')
        ->setParameter('documentId', 'mydocumentid')
        ->setMaxResults(1)
        ->getQuery()
        ->getSingleResult();

また、直接クエリは機能しません:

$query = $em->createQuery('
    SELECT
        u.*
    FROM
        Entity\\User u
    INNER JOIN
        Entity\\Document d ON d.user_id = u.id
    WHERE
        d.id = "mydocumentid"
');

これを実行するのを手伝ってくれませんか?

エラーメッセージ

[Semantical Error] line 0, col 66 near 'd ON d.user_id': Error: Identification Variable \Entity\Document used in join path expression but was not defined before.
4

1 に答える 1

3

使用する代わりに:

->innerJoin('\\Entity\\Document', 'd', \Doctrine\ORM\Query\Expr\Join::ON, 'd.user_id = u.id')

これを使用してみてください:

->innerJoin('u.documents', 'd', \Doctrine\ORM\Query\Expr\Join::ON, 'd.user_id = u.id')

これは、Doctrine がどのフィールドに参加する必要があるかを知る必要があるためuserですdocuments。フィールドDoctrineを知ることでターゲットエンティティを取得し、Doctineはクラスを直接認識します。

于 2012-11-05T14:07:49.823 に答える