66 votes

Doctrine et requête LIKE

J'ai une 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 celle-ci :

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

J'essaie de gérer la requête sans aimer :

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

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

166voto

Kristian Zondervan Points 946

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

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

27voto

ManseUK Points 26965

Vous pouvez utiliser la createQuery (directement 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', 'some@email.com');

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

Ou encore mieux - créez une classe de référentiel pour l'entité et créez une méthode à l'intérieur - cela la rendra réutilisable

4voto

elcukro Points 41

Ce n'est pas possible avec les méthodes magiques, mais vous pouvez y parvenir en utilisant DQL ( Doctrine Query Language ). Dans votre exemple, en supposant que vous ayez une entité nommée Orders with Product property, continuez et procédez comme suit :

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

Devrait faire exactement ce dont vous avez besoin.

0voto

Marco Points 1055

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

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

-4voto

Patrik Ken Points 53

tu peux aussi faire comme ça :

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

$tail = sizeof($ver);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X