Запрос 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 **
Ответы
Ответ 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);