Doctrine2 in ZF2 - DQL liefert ein anderes Ergebnis als die findOneBy-Methode

Ich habe diese Entität:

/**
 * User state.
 *
 * @ORM\Entity(repositoryClass="User\Repository\StateRepository")
 * @ORM\Table(name="user_state")
 */
class State implements StateInterface
{
    /** ONE-TO-ONE BIDIRECTIONAL, OWNING SIDE
     * @var User
     * @ORM\Id
     * @ORM\OneToOne(targetEntity="User\Entity\User", inversedBy="state")
     * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
     */
    protected $user;

    /** ONE-TO-ONE UNIDIRECTIONAL
     * @var \Application\Entity\State
     * @ORM\Id
     * @ORM\ManyToOne(targetEntity="Application\Entity\State", fetch="EAGER")
     * @ORM\JoinColumn(name="state_id", referencedColumnName="id")
     */
    protected $state;

    public function __construct(User $user, \Application\Entity\State $state)
    {
        $this->user = $user;
        $this->state = $state;
    }

    /********/
    /* USER */
    /********/
    /**
     * Get user
     *
     * @return User
     */
    public function getUser()
    {
        return $this->user;
    }

    /**
     * Set user
     *
     * @param User $user
     *
     * @return Email
     */
    public function setUser(User $user)
    {
        $this->user = $user;

        return $this;
    }

    /**********/
    /* STATUS */
    /**********/
    /**
     * Get state
     *
     * @return \Application\Entity\State
     */
    public function getState()
    {
        return $this->state;
    }

    /**
     * Set state
     *
     * @param \Application\Entity\State $state
     *
     * @return State
     */
    public function setState(\Application\Entity\State $state)
    {
        $this->state = $state;

        return $this;
    }

    /******/
    /* ID */
    /******/
    /**
     * Get id.
     *
     * @return int
     */
    public function getId()
    {
        return $this->state->getId();
    }

    /**
     * Set id.
     *
     * @param int $id
     *
     * @return State
     */
    public function setId($id)
    {
        $this->state->setId((int) $id);

        return $this;
    }

    /********/
    /* NAME */
    /********/
    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->state->getName();
    }

    /**
     * Set name
     *
     * @param string $name
     *
     * @return State
     */
    public function setName($name)
    {
        $this->state->setName((string) $name);

        return $this;
    }
}

Und um die Entität abzurufen, führe ich dies in meinem benutzerdefinierten Repository aus

return self::findOneBy($params);

Welche Ergebnisse in dieser Abfrage:

SELECT t0.user_id AS user_id1, t0.state_id AS state_id2, t3.id AS id4, t3.name AS name5 FROM user_state t0 LEFT JOIN state t3 ON t0.state_id = t3.id WHERE t0.user_id = ? LIMIT 1

Perfekt! Genau das, was ich wollte und die zugehörige Entität wird wegen der eifrig geholtfetch="EAGER" auf die Beziehung. Jetzt möchte ich dasselbe mit DQL erreichen, also mache ich das:

$query = $this->_em->createQuery("SELECT us, s FROM 'User\Entity\State' us LEFT JOIN us.state s WHERE us.user = :user_id");
$query->setParameters($params);
$query->setFetchMode('User\Entity\State', 'state', ClassMetadata::FETCH_EAGER);
return $query->getOneOrNullResult();

Ich erhalte eine Fehlermeldung mit:Call to a member function getId() on a non-object Anscheinend ist die zugehörige Entität nicht richtig geladen. Wenn ich das manuell überprüfe$state erweist sichNULL

Wenn ich das s in der Abfrage weglasse:

$query = $this->_em->createQuery("SELECT us FROM 'User\Entity\State' us LEFT JOIN us.state s WHERE us.user = :user_id");

Dann gibt es das Ergebnis genau so zurück, wie ich es haben möchte, aber es ergeben sich zwei Abfragen (eine zusätzliche Abfrage, um die zugehörige Zustandsentität zu erhalten), was offensichtlich sinnvoll ist, da die Abfrage nicht als a angesehen wirdfetch join länger, so lädt es faul die zugehörige Entität.

Wie kann ich das gleiche Ergebnis (eine Abfrage, ein Ergebnis) erzielen, das ich mit dem Befehl erhalten habe?findOneBy Methode aber als mit DQL?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage