我該怎麼辦主義findBy '不等於'
WHERE id != 1
教義?
我有這個迄今爲止
$this->getDoctrine()->getRepository('MyBundle:Image')->findById(1);
但我怎麼做一個「不等於」?
這可能很愚蠢,但我找不到任何這方面的參考?
謝謝
我該怎麼辦主義findBy '不等於'
WHERE id != 1
教義?
我有這個迄今爲止
$this->getDoctrine()->getRepository('MyBundle:Image')->findById(1);
但我怎麼做一個「不等於」?
這可能很愚蠢,但我找不到任何這方面的參考?
謝謝
有沒有內置的方法,允許你打算做什麼。
你有一個方法添加到您的存儲庫,就像這樣:
public function getWhatYouWant()
{
$qb = $this->createQueryBuilder('u');
$qb->where('u.id != :identifier')
->setParameter('identifier', 1);
return $qb->getQuery()
->getResult();
}
希望這有助於。
爲了讓多一點靈活性,我將在未來的功能添加到我的倉庫:
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);
請問您可以在哪裏添加此方法? –
在與實體相關的定製存儲庫中。在symphony中,要訪問使用默認存儲庫的數據,您可以定義自己的擴展。閱讀更多在[教條文檔](http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes) – Luis
從路易斯,你可以做更像默認的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)
);
現在有一個做到這一點的方法,使用學說的標準。
一個完整的例子可以在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);
很高興知道,感謝分享! –
這應該是真正的答案:)。 –
當時接受的答案被接受,這是正確的答案:)幾年後,情況發生了變化! –
我解決了這個比較容易(無需添加的方法),所以我給大家介紹:
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')
),
),
),
),
));
你是男人!我一直在尋找這個多年。你有沒有在文檔中找到任何關於此的內容? –
很確定我從瀏覽源代碼中挖掘了這個細節 –
謝謝,我相信其他人也在尋找這個。 –
我不知道這是如何回答這個問題,因爲它尋求基於價值-1匹配的記錄,而不是查詢不等於一個 – frak
這個答案在當時,這是正確的值書面,但現在支持;在這個問題的其他地方看到我的回答 –