web-dev-qa-db-fra.com

Doctrine et requête LIKE

J'ai entité pour Doctrine:

<?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;
}

J'ai besoin de faire une requête comme ceci:

select * from `orders` where `OrderEmail`='[email protected]' and `Product` LIKE 'My Products%'

J'essaie de gérer une requête sans comme:

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

Mais ça fait erreur. Pourquoi? Puis-je faire cette requête sans DQL? Je veux que cette requête utilise des méthodes magiques findBy **

55
Evgeniy

Ce n'est pas possible avec les méthodes de recherche magique. Essayez d’utiliser le constructeur de requêtes :

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

Vous pouvez utiliser la méthode createQuery (directe dans le contrôleur):

$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]');

Vous devez modifier AcmeCodeBundle pour qu'il corresponde au nom de votre lot.

Ou encore mieux - créer une classe de référentiel pour l'entité et y créer une méthode - cela le rendra réutilisable

22
ManseUK

Ceci n’est pas possible avec les méthodes magiques, mais vous pouvez y parvenir avec DQL ( Doctrine Query Language ). Dans votre exemple, en supposant que vous avez l'entité nommée Commandes avec la propriété Produit, continuez et procédez comme suit:

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

Devrait faire exactement ce dont vous avez besoin.

4
elcukro

En fait, il vous suffit de dire à doctrine qui est votre classe de référentiel, si ce n'est pas le cas, doctrine utilise le référentiel par défaut au lieu du vôtre.

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

0
Marco