Подтвердить что ты не робот

Запрос Doctrine и 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 **

4b9b3361

Ответ 1

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

$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();

Ответ 2

Вы можете использовать метод 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 в соответствии с вашим именем пакета

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

Ответ 3

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

$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();

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

Ответ 4

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

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

Ответ 5

вы также можете сделать это следующим образом:

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

$tail = sizeof($ver);