Doctrine orm 由'找到的学说;不等于';
我该怎么办Doctrine orm 由'找到的学说;不等于';,doctrine-orm,Doctrine Orm,我该怎么办 WHERE id != 1 在教义上 到目前为止,我有这个 $this->getDoctrine()->getRepository('MyBundle:Image')->findById(1); 但我如何才能做到“不平等” 这可能很愚蠢,但我找不到任何与此相关的参考 谢谢没有内置的方法可以让你做你想做的事情 您必须向存储库中添加一个方法,如下所示: public function getWhatYouWant() { $qb = $this->cr
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();
}
$this->getDoctrine()->getRepository('MyBundle:Image')->findByNot('id', 1);
希望这能有所帮助。为了提供更多的灵活性,我将在我的存储库中添加下一个函数:
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();
}
然后,我可以在我的控制器中这样调用它:
public function getWhatYouWant()
{
$qb = $this->createQueryBuilder('u');
$qb->where('u.id != :identifier')
->setParameter('identifier', 1);
return $qb->getQuery()
->getResult();
}
$this->getDoctrine()->getRepository('MyBundle:Image')->findByNot('id', 1);
根据Luis的回答,您可以做一些更像默认findBy方法的事情 首先,创建一个将由所有实体使用的默认存储库类
/*$config是实体管理器配置对象*/
$config->setDefaultRepositoryClassName('MyCompany\Repository');
或者您可以在config.yml中编辑此内容
原则:
orm:
默认\u存储库\u类:MyCompany\repository
然后:
现在有一种方法可以做到这一点,使用条令的标准
在中可以看到完整的示例,但下面是一个简短的答案
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);
我很容易就解决了这个问题(没有添加任何方法),因此我将与大家分享:
使用条令\通用\集合\标准代码>
$repository->匹配(Criteria::create()->where(Criteria::expr()->neq('id',1))代码>
顺便说一句,我正在使用Zend Framework 2中的条令ORM模块,我不确定这在任何其他情况下是否兼容
在我的例子中,我使用了如下的表单元素配置:在单选按钮数组中显示除“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')
),
),
),
),
));
我用QueryBuilder来获取数据
$query=$this->dm->createQueryBuilder('AppBundle:DocumentName')
->field('fieldName')->notEqual(null);
$data=$query->getQuery()->execute();
我不确定这是如何回答这个问题的,因为它试图根据值-1匹配记录,而不是查询不等于1的值。这个答案在编写时是正确的,但现在得到了支持;请参阅我在其他地方对此问题的回答。您能告诉我在何处添加此方法吗?在与实体相关的自定义存储库中。在symphony中,要使用默认存储库访问数据,可以定义自己的扩展到该存储库。当被接受的答案被接受时,请阅读更多信息。答案是正确的:)几年后,情况发生了变化!我建议更新:使用条令\通用\集合\标准$expr=标准::expr()$标准=标准::创建()@Jpsy我没有跟上Doctrine,有什么理由喜欢这样吗?@ElYobo:Doctrine\Common\Collections\Criteria被定义为一个带有静态方法的静态类(请参阅:)。因此,应该使用CLASS::method()
静态访问它,而不是使用newclass()
实例化它。是的,你说得对。我复制的代码片段来自我上面给出的链接,示例代码来自条令开发人员之一Ocramius,因此该API自编写以来可能已经发生了变化。你就是那个人!我已经找了很久了。你在文档中找到了这方面的任何信息吗?我很确定我是从浏览资料中挖掘出这个细节的谢谢,我相信其他人也在寻找这个。