Doctrine和LIKE查询

时间:2011-11-17 09:18:00

标签: php mysql doctrine-orm

我有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 **

5 个答案:

答案 0 :(得分:127)

使用魔法查找方法无法做到这一点。尝试使用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();

答案 1 :(得分:22)

您可以使用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以匹配您的包名称

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

答案 2 :(得分:4)

使用魔术方法无法做到这一点,但您可以使用DQL(Doctrine Query Language)实现此目的。在您的示例中,假设您具有名为Orders with 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();

应该完全按照你的需要做。

答案 3 :(得分:0)

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

@ORM \实体(repositoryClass = “公司\ NameOfBundle \库\ NameOfRepository”)

答案 4 :(得分:-2)

你也可以这样做:

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

$tail = sizeof($ver);