我有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 **
答案 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);