web-dev-qa-db-fra.com

Doctrine findBy 'n'est pas égal'

Comment fais-je

WHERE id != 1

Dans la doctrine?

J'ai ceci jusqu'à présent

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

Mais comment faire un "ne pas égaux"?

C'est peut-être idiot, mais je ne trouve aucune référence à cela?

Merci

39
Jake N

Aucune méthode intégrée ne permet ce que vous avez l'intention de faire.

Vous devez ajouter une méthode à votre référentiel, comme ceci:

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

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

J'espère que cela t'aides.

33
BADAOUI Mohamed

Il existe maintenant une approche pour ce faire, qui utilise les critères de Doctrine.

Un exemple complet peut être vu dans Comment utiliser une méthode findBy avec des critères comparatifs , mais une réponse brève 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);
49
El Yobo

Pour donner un peu plus de flexibilité, j'ajouterais la fonction suivante à mon référentiel:

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

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

$this->getDoctrine()->getRepository('MyBundle:Image')->findByNot('id', 1);
21
Luis

Sur la base de la réponse de Luis, vous pouvez faire quelque chose de plus similaire à la méthode findBy par défaut.

Commencez par créer une classe de référentiel par défaut qui sera utilisée par toutes vos entités.

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

Ensuite:

<?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'utilisation est identique à la méthode findBy, exemple:

$entityManager->getRepository( 'MyRepo' )->findByNot(
    array( 'status' => Status::STATUS_DISABLED )
);
11
JCM

Je l'ai résolu 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) ) );

En passant, j'utilise le module 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 celle-ci: 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')
                ),
            ),
        ),
    ),
));
8
Emery King