Учение и НРАВИТСЯ запрос - PullRequest
55 голосов
/ 17 ноября 2011

У меня есть сущность для Доктрины:

<?php
/**
 * @Entity
 * @Table(name="orders")
 */
class Orders {
    /** @Id @Column(name="OID",type="integer") @GeneratedValue */
    private $id;
    /** @Column(name="Product",type="string")*/
        private $product;
    /** @Column(name="RegCode",type="string")*/
        private $reg_code;
    /** @Column(name="OrderEmail",type="string")*/
    private $email;
}

Мне нужно сделать запрос следующим образом:

select * from `orders` where `OrderEmail`='some@mail.com' and `Product` LIKE 'My Products%'

Я пытаюсь обработать запрос без:

$em->getRepository("Orders")->findByEmailAndProduct($uname,$product);

Но это делает ошибку.Зачем?Могу ли я сделать этот запрос без DQL?Я хочу, чтобы этот запрос использовал магические методы findBy **

Ответы [ 5 ]

129 голосов
/ 17 ноября 2011

Это невозможно при использовании магических методов поиска.Попробуйте использовать построитель запросов :

$result = $em->getRepository("Orders")->createQueryBuilder('o')
   ->where('o.OrderEmail = :email')
   ->andWhere('o.Product LIKE :product')
   ->setParameter('email', 'some@mail.com')
   ->setParameter('product', 'My Products%')
   ->getQuery()
   ->getResult();
22 голосов
/ 17 ноября 2011

Вы можете использовать метод createQuery (непосредственно в контроллере):

$query = $em->createQuery("SELECT o FROM AcmeCodeBundle:Orders o WHERE o.OrderMail =  :ordermail and o.Product like :searchterm")
->setParameter('searchterm', '%'.$searchterm.'%')
->setParameter('ordermail', 'some@email.com');

Вам необходимо изменить AcmeCodeBundle, чтобы он соответствовал имени вашего пакета

Или даже лучше - создать репозиторийкласс для сущности и создайте там метод - это сделает его многоразовым

4 голосов
/ 15 октября 2016

Это невозможно с помощью магических методов, однако этого можно добиться с помощью DQL ( Doctrine Query Language ).В вашем примере, если у вас есть сущность с именем Orders со свойством Product, просто сделайте следующее:

$dql_query = $em->createQuery("
    SELECT o FROM AcmeCodeBundle:Orders o
    WHERE 
      o.OrderEmail = 'some@mail.com' AND
      o.Product LIKE 'My Products%'
");
$orders = $dql_query->getResult();

Должен делать именно то, что вам нужно.

0 голосов
/ 28 июня 2016

Вы также можете сделать это так:

$ver = $em->getRepository('GedDocumentBundle:version')->search($val);

$tail = sizeof($ver);
0 голосов
/ 15 октября 2013

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

@ ORM \ Entity (repositoryClass = "Company \ NameOfBundle \ Repository \ NameOfRepository«)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...