Doctrine 和 LIKE 查询

Posted

技术标签:

【中文标题】Doctrine 和 LIKE 查询【英文标题】:Doctrine and LIKE query 【发布时间】:2011-12-31 04:04:46 【问题描述】:

我有 Doctrine 的实体:

<?php
/**
 * @Entity
 * @Table(name="orders")
 */
class Orders 
    /** @Id @Column(name="OID",type="integer") @GeneratedValue */
    private $id;
    /** @Column(name="Product",type="string")*/
        private $product;
    /** @Column(name="RegCode",type="string")*/
        private $reg_code;
    /** @Column(name="OrderEmail",type="string")*/
    private $email;

我需要这样查询:

select * from `orders` where `OrderEmail`='some@mail.com' and `Product` LIKE 'My Products%'

我尝试处理不喜欢的查询:

$em->getRepository("Orders")->findByEmailAndProduct($uname,$product);

但它会出错。为什么? 我可以在没有 DQL 的情况下执行此查询吗?我想让这个查询使用魔术方法 findBy**

【问题讨论】:

什么错误?但是没有办法使用findBy* 来做到这一点,因为 Doctrine dont know what field you want to compare using LIKE` 【参考方案1】:

您可以使用createQuery 方法(直接在控制器中):

$query = $em->createQuery("SELECT o FROM AcmeCodeBundle:Orders o WHERE o.OrderMail =  :ordermail and o.Product like :searchterm")
->setParameter('searchterm', '%'.$searchterm.'%')
->setParameter('ordermail', 'some@email.com');

您需要更改 AcmeCodeBundle 以匹配您的包名称

或者甚至更好 - 为实体创建一个存储库类并在其中创建一个方法 - 这将使其可重用

【讨论】:

我知道如何在 DQL 上进行此查询。也许您知道如何在没有 DQL 的情况下实现它以及为什么“findByEmailAndProduct”不起作用。 @Evgeniy 已更新 - 您需要对其进行测试,因为我不确定 findby 方法是否使用类似【参考方案2】:

这对于神奇的 find 方法是不可能的。尝试使用query builder:

$result = $em->getRepository("Orders")->createQueryBuilder('o')
   ->where('o.OrderEmail = :email')
   ->andWhere('o.Product LIKE :product')
   ->setParameter('email', 'some@mail.com')
   ->setParameter('product', 'My Products%')
   ->getQuery()
   ->getResult();

【讨论】:

谢谢例如。我可以使用 QueryBuilder 进行分组吗? 我将教义与 Zend 框架一起使用。谢谢你在 Symfony 网站上的链接。也许我会找到更多关于它的信息。 是的,您可以使用 groupBy 和许多其他 helper methods【参考方案3】:

实际上你只需要告诉教义谁是你的存储库类,如果你不这样做,教义使用默认存储库而不是你的。

@ORM\Entity(repositoryClass="Company\NameOfBundle\Repository\NameOfRepository")

【讨论】:

【参考方案4】:

你也可以这样做:

$ver = $em->getRepository('GedDocumentBundle:version')->search($val);

$tail = sizeof($ver);

【讨论】:

【参考方案5】:

魔法方法无法做到这一点,但是您可以使用 DQL (Doctrine Query Language) 来实现。在您的示例中,假设您有名为 Orders 且具有 Product 属性的实体,请继续执行以下操作:

$dql_query = $em->createQuery("
    SELECT o FROM AcmeCodeBundle:Orders o
    WHERE 
      o.OrderEmail = 'some@mail.com' AND
      o.Product LIKE 'My Products%'
");
$orders = $dql_query->getResult();

应该做你需要的。

【讨论】:

这段代码 sn-p 创建了 SQL 注入的能力,如果你想自己构建查询,而不是使用 @ManseUK 的答案。但这不是 OP 想要的..

以上是关于Doctrine 和 LIKE 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 Doctrine 查询构建器正确转义 LIKE 查询

用LIKE进行Doctrine 2查询

Doctrine 的 findBy*() 中的 LIKE 和 % 通配符

Doctrine and Symfony2: WHERE a.title LIKE $array

带有 LIKE 的 Symfony Sonata SEO 自定义 sql 查询

如何在 Doctrine 2 中正确添加一对多关系?