Doctrine findBy "n'est pas égal"

Comment faire

WHERE id != 1

En Doctrine?

j'ai cette mesure

$this->getDoctrine()->getRepository('MyBundle:Image')->findById(1);

mais comment faire un "ne pas égaler"?

c'est peut-être idiot, mais je ne trouve aucune référence à ça?

Merci

34
demandé sur Jake N 2012-12-30 01:09:31

5 réponses

il n'y a pas de méthode intégrée qui permet ce que vous avez l'intention de faire.

vous devez ajouter une méthode à votre dépôt, comme ceci:

public function getWhatYouWant()
{
    $qb = $this->createQueryBuilder('u');
    $qb->where('u.id != :identifier')
       ->setParameter('identifier', 1);

    return $qb->getQuery()
          ->getResult();
}

Espérons que cette aide.

30
répondu BADAOUI Mohamed 2014-09-18 14:04:55

il y a maintenant une approche pour le faire, en utilisant les critères de la Doctrine.

un exemple complet peut être vu dans comment utiliser une méthode findBy avec les critères comparatifs , mais une brève réponse suit.

use \Doctrine\Common\Collections\Criteria;

// Add a not equals parameter to your criteria
$criteria = new Criteria();
$criteria->where(Criteria::expr()->neq('prize', 200));

// Find all from the repository matching your criteria
$result = $entityRepository->matching($criteria);
44
répondu El Yobo 2018-05-30 13:29:57

pour donner un peu plus de flexibilité, j'ajouterais la fonction suivante à mon dépôt:

public function findByNot($field, $value)
{
    $qb = $this->createQueryBuilder('a');
    $qb->where($qb->expr()->not($qb->expr()->eq('a.'.$field, '?1')));
    $qb->setParameter(1, $value);

    return $qb->getQuery()
        ->getResult();
}

Alors, je pourrais l'appeler dans mon contrôleur comme ceci:

$this->getDoctrine()->getRepository('MyBundle:Image')->findByNot('id', 1);
20
répondu Luis 2013-05-24 21:16:39

basé sur la réponse de Luis, vous pouvez faire quelque chose de plus comme la méthode par défaut findBy.

tout d'abord, créez une classe de dépôt par défaut qui sera utilisée par toutes vos entités.

/* $config is the entity manager configuration object. */
$config->setDefaultRepositoryClassName( 'MyCompany\Repository' );

puis:

<?php

namespace MyCompany;

use Doctrine\ORM\EntityRepository;

class Repository extends EntityRepository {

    public function findByNot( array $criteria, array $orderBy = null, $limit = null, $offset = null )
    {
        $qb = $this->getEntityManager()->createQueryBuilder();
        $expr = $this->getEntityManager()->getExpressionBuilder();

        $qb->select( 'entity' )
            ->from( $this->getEntityName(), 'entity' );

        foreach ( $criteria as $field => $value ) {

            $qb->andWhere( $expr->neq( 'entity.' . $field, $value ) );
        }

        if ( $orderBy ) {

            foreach ( $orderBy as $field => $order ) {

                $qb->addOrderBy( 'entity.' . $field, $order );
            }
        }

        if ( $limit )
            $qb->setMaxResults( $limit );

        if ( $offset )
            $qb->setFirstResult( $offset );

        return $qb->getQuery()
            ->getResult();
    }

}

l'usage est le même que la méthode findBy, exemple:

$entityManager->getRepository( 'MyRepo' )->findByNot(
    array( 'status' => Status::STATUS_DISABLED )
);
11
répondu JCM 2014-04-12 12:57:37

j'ai résolu ce assez facilement (sans ajouter de méthode) donc je vais partager:

use Doctrine\Common\Collections\Criteria;

$repository->matching( Criteria::create()->where( Criteria::expr()->neq('id', 1) ) );

soit dit en passant, j'utilise le module de Doctrine ORM de Zend Framework 2 et je ne suis pas sûr que ce soit compatible dans les autres cas.

dans mon cas, j'utilisais une configuration d'élément de formulaire comme ceci: pour afficher tous les rôles sauf" invité " dans un tableau de boutons radio.

$this->add(array(
    'type' => 'DoctrineModule\Form\Element\ObjectRadio',
        'name' => 'roles',
        'options' => array(
            'label' => _('Roles'),
            'object_manager' => $this->getEntityManager(),
            'target_class'   => 'Application\Entity\Role',
            'property' => 'roleId',
            'find_method'    => array(
                'name'   => 'matching',
                'params' => array(
                    'criteria' => Criteria::create()->where(
                        Criteria::expr()->neq('roleId', 'guest')
                ),
            ),
        ),
    ),
));
7
répondu Marshall House 2015-05-01 07:24:31