【问题标题】:Symfony Equal to and Not Equal to Criteria on EntitySymfony 等于和不等于关于实体的标准
【发布时间】:2017-05-18 16:33:33
【问题描述】:

我想对实体结果执行查找操作。

$stores = c2gr($this, 'EducateToolsBundle:Stores')->findBy(['selectOption' => true, 'center_type_id' => 9])

我想做 center_type_id != 9

【问题讨论】:

  • c2gr() 返回的是什么? (存储库实例?)

标签: sql symfony doctrine-orm


【解决方案1】:

只需使用 DQL 或 QueryBuilder

$repository
    ->createQueryBuilder('s')
    ->where('s.selectOption = :selectOption')
    ->andWhere('s.center_type_id <> :center_type_id')
    ->setParameters([
        'selectOption'   => true
        'center_type_id' => 9,
    ])
    ->getQuery()
    ->getResult();

【讨论】:

  • 我得到了同样策略的解决方案。有没有其他办法?
  • 其他方式是 1) 使用手动遍历和过滤的延迟/急切加载或 2) 使用本机查询。这两种方法都有一个明显的缺点。 DQL/QueryBuilder 或 Criteria API 是您的选择。
【解决方案2】:

您应该能够通过使用Criteria 类来实现这一点。像这样的东西应该可以工作:

use Doctrine\Common\Collections\Criteria;

$criteria = Criteria::create();

$criteria->where($criteria->expr()->neq('center_type_id', 9));
$criteria->andWhere($criteria->expr()->eq('selectOption', true));

$entityRepository = $this->getDoctrine()->getRepository('C2EducateToolsBundle:Stores');

$result = $entityRepository->matching($criteria);

注意: 如果您在扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller 的类中,则上述方法将起作用,因为它使用的是 getDoctrine 方法。如果您不在此类中,则应注入 EntityManager 或从服务容器中获取。

更多详情请查看this answer

【讨论】:

  • 'Doctrine\Common\Collections\Criteria' 将随 Doctrine 一起提供。?如果可以,您可以分享我必须在控制器中使用的文件路径,如果不分享相关文档。
  • 是的,它是 Doctrine 2.3 版本的一部分,检查我编辑的答案,我添加了use 声明
  • 可以使用命名空间更新您的答案,包括在实体和控制器中。
  • 致命错误:找不到类 'Doctrine\Common\Collections\Criteria'
  • 那么我们有一个答案:Criteria is available from version 2.3
猜你喜欢
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2016-11-03
相关资源
最近更新 更多