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自编写以来可能已经发生了变化。你就是那个人!我已经找了很久了。你在文档中找到了这方面的任何信息吗?我很确定我是从浏览资料中挖掘出这个细节的谢谢,我相信其他人也在寻找这个。