web-dev-qa-db-fra.com

Doctrine findBy avec OR condition

Est-il possible d'utiliser l'instruction OR dans la méthode Doctrine findBy()? Je sais que le tableau donné est interprété comme case1 AND case2... Comme ça

$this->repos['notif']->findBy(array('status' => 1, 'status' => 2, 'status' => 3);

Représente

SELECT * FROM `notif` WHERE status=1 AND status=2 AND status=3;

Maintenant, j'ai besoin de quelque chose pour défendre:

SELECT * FROM `notif` WHERE status=1 OR status=2 OR status=3;

Existe-t-il un moyen d'obtenir tous les cas?

44
ArVan

Pour autant que je sache, ce n'est pas une fonctionnalité prise en charge par Doctrine pour utiliser les requêtes IN () avec findby. Vous pouvez faire deux choses:

  1. Implémentez une méthode findByStatus(array $statusTypes) dans votre classe de référentiel 'notif' (personnalisée). Si vous aimez cette approche, je peux vous donner un exemple.

  2. Convertissez votre findBy comme suit:

    $qb = $this->repos['notif']->createQueryBuilder('n');
    $data = $qb->where($qb->expr()->in('status', array(1,2,3)))->getQuery()->getResult();
    

Cela devrait fonctionner soit :)

14
Kees Schepers

Tu peux écrire:

$this->repos['notif']->findBy(array('status' => array(1, 2, 3)));

et cela devrait fonctionner aussi.

145
user3012985

Je sais que c'est une vieille question. Quoi qu'il en soit, il est possible d'utiliser Criteria pour les requêtes complexes (dans Doctrine 2 au moins):

$criteria = new \Doctrine\Common\Collections\Criteria();
$criteria
  ->orWhere($criteria->expr()->contains('domains', 'a'))
  ->orWhere($criteria->expr()->contains('domains', 'b'));

$groups = $em
  ->getRepository('Group')
  ->matching($criteria);
14
antongorodezkiy

Si vous utilisez MongoDB et avez besoin de requêtes plus complexes, comme "moins de" liées avec OR, mais ne pouvez pas utiliser un générateur de requêtes, cela fonctionne également avec cette syntaxe:

   ->findBy(array(
                '$or' => array(
                    array('foo' => array('$lt' => 1234)),
                    array('$and' => array(
                        array('bar' => 45678),
                        array('baz' => array('$lt' => 89013))
                    ))
                )
    ));

Ou comme solution à votre question:

   ->findBy(array(
                '$or' => array(
                    array('status' => 1),
                    array('status' => 2),
                    array('status' => 3),
                )
    ));
8
Paul Weber