简体   繁体   中英

Doctrine2 query error in OneToMany relation

I've got a doctrine2 problem with a MySQL database:

I have a model User and a model Documents . Each User may have 0 or n Documents . Each Document is assigned to exactly one User . My models:

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;
    }
}

Document

<?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;
}

Now I want to get the User of a given Document ID. The SQL-query would be:

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

But this does't work:

$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();

Also the direct query doesn't work:

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

Could you please help me to get this run?

Error message

[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.

Instead of using:

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

Try using this:

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

This is because Doctrine needs to know to which field in user the documents have to be joined. Knowing the field Doctrine will fetch the target entity and that way Doctine directly knows the class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM