doctrine2 - использовать пользовательский метод получения запросов - PullRequest
2 голосов
/ 09 сентября 2011

Я использую Symfony2 и Doctrine2. Как бы я использовал другой запрос для метода get? (плохо сформулированный, позвольте мне объяснить)

т.е. У меня есть объект приложения, это имеет отношение один ко многим с версией

так что в моем приложении я имею:

/**
 * Get versions
 *
 * @return Doctrine\Common\Collections\Collection 
 */
public function getVersions()
{
    return $this->versions;
}

Это все хорошо, однако, как я могу реализовать метод, такой как

getCurrentVersion, где я выполняю простой запрос, такой как:

SELECT v.* FROM version WHERE application_id = 1 AND current = 1

и так в шаблоне ветки, я могу сделать:

{% for application in applications %}
   Name : {{ application.name }}
   Current Version: {{ application.getCurrentVersion }}
{% endfor %}

Любая помощь очень ценится.

p.s. если я поступаю неправильно, пожалуйста, просветите меня.

Спасибо.

РЕДАКТИРОВАТЬ: http://www.doctrine -project.org / docs / orm / 2.1 / en / reference / sizes-and-known-questions.html # join-columns-with-non-primary-keys Серьезно?!

РЕДАКТИРОВАТЬ, я действительно не хочу этого делать, это ненужно и расточительно:

public function getCurrentVersion
{
   foreach($this->versions as $version)
   {
      if($version->current)
      {
        return $version;
      }

   }
}

Ответы [ 2 ]

5 голосов
/ 08 августа 2012
2 голосов
/ 09 сентября 2011

Во-первых, вы не должны касаться базы данных от вашей сущности. Считается плохой практикой внедрять менеджер сущностей в управляемую сущность, и у него нет никакой возможности узнать об уровне данных иначе.

Чтобы сделать то, что вы просите, вы можете использовать пользовательский репозиторий сущностей с методом getCurrentVersion, который принимает идентификатор или экземпляр сущности и выполняет запрос к нему:

// class Foo\Bundle\Repository\BarRepository
public function getCurrentVersion(MyClass $class)
{
    $dql = 'SELECT v FROM Namespace\Of\Version\Class v WHERE v.application_id=:id AND current=1';
    $query = $this->_em->createQuery($dql);
    $query->setParameter('id', $class->getId());
    $version = $query->execute();

    return $version;
}

Обратите внимание, что если вы ожидаете только одну версию, вы можете использовать $query->getSingleResult(); вместо $query->execute();

Тем не менее, похоже, что вы пытаетесь создать версию / историю для некоторых классов, в этом случае вам следует проверить Gedmo DoctrineExtensions и связанный с ним Symfony2 bundle ; в частности, взгляните на поведенческое расширение Loggable, которое прозрачно управляет версиями ваших сущностей.

...