Я не могу найти документацию об именованных запросах в Doctrine2. Пожалуйста помоги. Есть ли у Doctrine2 именованные запросы?
Doctrine2 с именем queries
Ответ 1
Вы можете использовать
-
NamedQuery - DQL. Пример
use Doctrine\ORM\Mapping\NamedQuery; use Doctrine\ORM\Mapping\NamedQueries; /** * @Entity * @Table(name="cms_users") * @NamedQueries({ * @NamedQuery(name="activated", query="SELECT u FROM __CLASS__ u WHERE u.status = 1") * }) */ class CmsUser {}
И назовите его как
$this->getDoctrine()->getRepository('MyBundle:CmsUser') ->createNamedQuery('activated') ->getResult();
-
NamedNativeQuery - SQL. Более подробная информация здесь: http://docs.doctrine-project.org/en/latest/reference/native-sql.html#named-native-query
-
Сбор запросов в вашем EntityRepository, например:
namespace Acme\StoreBundle\Repository; use Doctrine\ORM\EntityRepository; class ProductRepository extends EntityRepository { public function findAllOrderedByName() { return $this->getEntityManager() ->createQuery('SELECT p FROM AcmeStoreBundle:Product p ORDER BY p.name ASC') ->getResult(); } }
Дополнительная информация здесь: http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes
Похожие темы здесь: https://groups.google.com/forum/?fromgroups#!topic/doctrine-user/K-D5ta5tZ3Y [1-25]
Ответ 2
Возможно, вас будут интересовать EntityRepositories, где вы можете создавать и хранить сложные запросы Doctrine и вызывать тему в своем проекте, где хотите:
http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes
Ответ 3
Вы можете вызывать функции, используемые внутри, по нотации аннотаций в конструкторе вашего репозитория, если вы не хотите испортить определение своей сущности:
namespace MyBundle\Repository;
use Doctrine\ORM\EntityRepository;
class CmsUserRepository extends EntityRepository
{
public function __construct($em, \Doctrine\ORM\Mapping\ClassMetadata $class)
{
$this->getClassMetadata()->addNamedQuery(array(
'name' => 'activated',
'query' => 'SELECT u FROM __CLASS__ u WHERE u.status = 1'
));
}
}
Вы также можете заменить часть выражения __CLASS__
в заявлении пространством имен и классом вашего объекта, например MyBundle\Entity\CmsUser
Ответ 4
Я нашел этот вопрос в поисках примеров Native Named Query, этот ответ мне помог, поэтому я решил поделиться с ним таким же способом, как и для собственного именованного запроса.
Добавьте это в конструктор для репозитория вашей организации
public function __construct($em, \Doctrine\ORM\Mapping\ClassMetadata $class)
{
parent::__construct($em, $class);
$this->getClassMetadata()->addNamedNativeQuery(
array('name' => 'published',
'query' => 'SELECT
t0.id AS id,
t0.tracking_uri AS tracking_uri,
t0.name AS name,
t0.description AS description,
t0.url_name AS url_name,
t0.status_type_id as status_type_id
FROM
store.store t0
WHERE
t0.status_type_id = 2',
'resultClass' => '__CLASS__',
'resultSetMapping' => array('entities' => array('entityClass' => '__CLASS__',
'fields' => array('id' => 'id',
'tracking_url' => 'tracking_url',
'name' => 'name',
'description' => 'description',
'url_name' => 'url_name',
'status_type' => 'status_type_id')))));
}
Здесь клип моего теста для этого
public function testNamedNativeQueryPublished()
{
$results = $this->em->getRepository('MyBundle:Store')->createNativeNamedQuery('published')->execute();
foreach ($results as $store)
{
$this->assertEquals(2, $store->getStatusType());
}
}