Доктрина и запрос LIKE

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

<?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`='[email protected]' and `Product` LIKE 'My Products%'

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

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

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


person Eugene    schedule 17.11.2011    source источник
comment
Какая ошибка? Но сделать это с помощью findBy* невозможно, потому что Doctrine dont know what field you want to compare using LIKE`   -  person azat    schedule 17.11.2011


Ответы (5)


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

$result = $em->getRepository("Orders")->createQueryBuilder('o')
   ->where('o.OrderEmail = :email')
   ->andWhere('o.Product LIKE :product')
   ->setParameter('email', '[email protected]')
   ->setParameter('product', 'My Products%')
   ->getQuery()
   ->getResult();
person Kristian Zondervan    schedule 17.11.2011
comment
Спасибо например. Могу ли я создать группу с помощью QueryBuilder? - person Eugene; 17.11.2011
comment
Я использую доктрину с Zend Framework. Спасибо за ссылку на сайте Symfony. Может быть, я найду больше информации о нем. - person Eugene; 17.11.2011
comment
Да, вы можете использовать groupBy и множество других вспомогательные методы - person Kristian Zondervan; 17.11.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', '[email protected]');

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

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

person Manse    schedule 17.11.2011
comment
Я знаю, как сделать этот запрос на DQL. Может быть, вы знаете, как это сделать без DQL и почему не работает findByEmailAndProduct. - person Eugene; 17.11.2011
comment
@Evgeniy обновлено - вам нужно будет проверить это, так как я не уверен, что метод findby использует как - person Manse; 17.11.2011

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

$dql_query = $em->createQuery("
    SELECT o FROM AcmeCodeBundle:Orders o
    WHERE 
      o.OrderEmail = '[email protected]' AND
      o.Product LIKE 'My Products%'
");
$orders = $dql_query->getResult();

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

person elcukro    schedule 14.10.2016
comment
Этот фрагмент кода создает возможность SQL-инъекции. Если вы хотите создать запрос самостоятельно, лучше используйте ответ @ManseUK. Но это не то, чего хотел ОП. - person Dennis98; 19.01.2018

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

@ORM\Entity(repositoryClass="Компания\NameOfBundle\Repository\NameOfRepository")

person Marco    schedule 15.10.2013

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

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

$tail = sizeof($ver);
person Patrik Ken    schedule 28.06.2016