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
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.
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);
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);
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 )
);
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')
),
),
),
),
));