Doctrine findBy avec ou condition

Est-il possible d'utiliser OR énoncé de Doctrine findBy() méthode? Je sais que le tableau donné est interprété comme case1 AND case2... Comme ceci

$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 à se tenir pour:

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

Est-il possible d'obtenir tous les cas?

40
demandé sur ArVan 2012-02-13 14:42:40

4 réponses

pour autant que je sache, ce n'est pas une fonctionnalité supportée par Doctrine à utiliser dans les requêtes() avec findby. Vous pourriez faire deux choses:

  1. implémenter un findByStatus(array $statusTypes) méthode dans votre classe de dépôt 'notif' (personnalisée). Si vous aimez cette approche, je peux vous donner un exemple.

  2. Convertissez votre findBy en:

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

cela devrait fonctionner :)

13
répondu Kees Schepers 2012-02-13 10:54:30

Vous pouvez écrire:

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

et ça devrait fonctionner aussi.

134
répondu user3012985 2013-11-20 12:15:15

je sais que c'est une vieille question. De toute façon, il est possible d'utiliser Criteria pour les requêtes complexes (dans la 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);
13
répondu antongorodezkiy 2015-04-08 23:18:40

Si vous utilisez MongoDB et ont besoin de plus de requêtes complexes, comme des "moins que" liés à OU de, mais ne peut pas utiliser un générateur de requêtes, cela fonctionne aussi avec cette syntaxe:

   ->findBy(array(
                '$or' => array(
                    array('foo' => array('$lt' => 1234)),
                    array('$and' => array(
                        array('bar' => 45678),
                        array('baz' => array('$lt' => 89013))
                    ))
                )
    ));
   ->findBy(array(
                '$or' => array(
                    array('status' => 1),
                    array('status' => 2),
                    array('status' => 3),
                )
    ));
7
répondu Paul Weber 2016-01-29 09:26:18