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 **
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();
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
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.
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")