доктрина, хранящая результат? - PullRequest
0 голосов
/ 30 апреля 2011

Я новичок в доктрине и столкнулся с проблемой.Вот оно:

У меня есть следующая модель / сущность:

<?php
namespace models;

/** @Entity @Table(name="teams") @HasLifecycleCallbacks */
class Team
{

...

/** @OneToMany(targetEntity="Teammember", mappedBy="team") */
private $members;

...

function getTeamsILeadForGame($user, $game)
{
    $q = $this->doctrine->em->createQuery("SELECT t, tm FROM models\Team t JOIN t.members tm WHERE tm.user = ?1 AND t.game = ?2 AND tm.is_leader = ?3 ORDER BY t.name ASC");
    $q->setParameter(1, $user);
    $q->setParameter(2, $game);
    $q->setParameter(3, 1);

    try {
        return $q->getResult();
    } catch (\Doctrine\ORM\NoResultException $e) {
        return null;
    }
}
}

Как видите, есть ссылка на сущность Teammember.В функции, которую я написал, я пытаюсь получить все команды, в которых текущий пользователь имеет флаг is_leader, установленный в 1.

Этот запрос выполняется просто отлично, и я ожидаю, что результат будет таким.

Теперь о проблеме.Далее в моем контроллере я пытаюсь сделать следующее:

$ postteam = $ this-> em-> find ('models \ Team', $ this-> input-> post ('team'));

Данные команды, которые она возвращает, верны, но когда я вызываю $ postteam-> getMembers (), он просто возвращает 1 строку (ту, где is_leader = 1) вместо всех членов этой команды.

Значит, похоже, что доктрина удерживает мою другую функцию в затылке?Я действительно не понимаю, почему это так.

Итак, как я уже сказал, мой контроллер выглядит следующим образом:

$teams = models\Team::getTeamsILeadForGame($this->user->getId(), $tournament->getGame()->getId());

// Do some checks on the returned teams

$postteam = $this->em->find('models\Team', $this->input->post('team'));
$postteam->getMembers();

Когда я удаляю $ team = models ....... линия, все снова работает нормально.Таким образом, мне кажется, что доктрина фильтрует свой внутренний набор результатов по этой строке, а затем выполняет поиск только в этом наборе результатов.

Есть идеи, как это исправить?Thnx

1 Ответ

0 голосов
/ 02 мая 2011

Я понял это окончательно: D

Оказывается, это связано с ленивой загрузкой. Как только я установил 'fetch = eager' по ссылке на участников, все заработало нормально.

Надеюсь, это поможет людям с такой же проблемой ...

...