2012-12-29 26 views
30

我該怎麼辦主義findBy '不等於'

WHERE id != 1 

教義?

我有這個迄今爲止

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

但我怎麼做一個「不等於」?

這可能很愚蠢,但我找不到任何這方面的參考?

謝謝

回答

27

有沒有內置的方法,允許你打算做什麼。

你有一個方法添加到您的存儲庫,就像這樣:

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

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

希望這有助於。

+0

我不知道這是如何回答這個問題,因爲它尋求基於價值-1匹配的記錄,而不是查詢不等於一個 – frak

+0

這個答案在當時,這是正確的值書面,但現在支持;在這個問題的其他地方看到我的回答 –

19

爲了讓多一點靈活性,我將在未來的功能添加到我的倉庫:

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

然後,我可以把它在我的控制器是這樣的:根據答案

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

請問您可以在哪裏添加此方法? –

+1

在與實體相關的定製存儲庫中。在symphony中,要訪問使用默認存儲庫的數據,您可以定義自己的擴展。閱讀更多在[教條文檔](http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes) – Luis

11

從路易斯,你可以做更像默認的findBy方法。

首先,創建一個將被所有實體使用的默認存儲庫類。

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

然後:

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

} 

的使用比findBy方法,例如相同:

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

現在有一個做到這一點的方法,使用學說的標準。

一個完整的例子可以在How to use a findBy method with comparative criteria待觀察,但簡短的回答如下。

use \Doctrine\Common\Collections\Criteria; 

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

// Find all from the repository matching your criteria 
$result = $entityRepository->matching($criteria); 
+0

很高興知道,感謝分享! –

+0

這應該是真正的答案:)。 –

+3

當時接受的答案被接受,這是正確的答案:)幾年後,情況發生了變化! –

7

我解決了這個比較容易(無需添加的方法),所以我給大家介紹:

use Doctrine\Common\Collections\Criteria;

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

順便說一句,我使用的學說ORM模塊從Zend Framework 2中,我不確定這是否會在任何其他情況下兼容。

在我的情況下,我使用了這樣的表單元素配置:顯示單選按鈕數組中除「guest」之外的所有角色。

$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') 
       ), 
      ), 
     ), 
    ), 
)); 
+0

你是男人!我一直在尋找這個多年。你有沒有在文檔中找到任何關於此的內容? –

+1

很確定我從瀏覽源代碼中挖掘了這個細節 –

+0

謝謝,我相信其他人也在尋找這個。 –