52 votes

Doctrine findBy avec condition OR

Est-il possible d'utiliser OR déclaration dans 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);

Signifie

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

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

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

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

174voto

user3012985 Points 1741

Vous pouvez écrire :

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

et cela devrait fonctionner aussi.

22voto

antongorodezkiy Points 76

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

16voto

Kees Schepers Points 1326

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

  1. Mettre en œuvre un findByStatus(array $statusTypes) dans votre classe (personnalisée) de référentiel "notif". Si vous aimez cette approche, je peux vous donner un exemple.

  2. Convertissez votre findBy en ce qui suit :

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

Cela devrait aussi fonctionner :)

9voto

Paul Weber Points 505

Si vous utilisez MongoDB et que vous avez besoin de requêtes plus complexes, comme "moins que" lié à OR, mais que vous ne pouvez pas utiliser un constructeur 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),
                )
    ));

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