web-dev-qa-db-ja.com

DoctrineおよびLIKEクエリ

私は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`='[email protected]' and `Product` LIKE 'My Products%'

私は次のようなことなくクエリを処理しようとします:

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

しかし、それは間違いを犯します。どうして? DQLなしでこのクエリを実行できますか?このクエリでマジックメソッドを使用するようにしますfindBy **

55
Evgeniy

これは、魔法のfindメソッドでは不可能です。 クエリビルダー を使用してみてください:

$result = $em->getRepository("Orders")->createQueryBuilder('o')
   ->where('o.OrderEmail = :email')
   ->andWhere('o.Product LIKE :product')
   ->setParameter('email', '[email protected]')
   ->setParameter('product', 'My Products%')
   ->getQuery()
   ->getResult();
133

createQueryメソッドを使用できます(コントローラーで直接):

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

バンドル名に一致するようにAcmeCodeBundleを変更する必要があります

またはさらに良い-エンティティのリポジトリクラスを作成し、そこにメソッドを作成します-これにより再利用可能になります

22
ManseUK

これはマジックメソッドでは不可能ですが、DQL( Doctrine Query Language )を使用してこれを実現できます。この例では、Orders with Productプロパティというエンティティがあると仮定して、先に進んで次を実行します。

$dql_query = $em->createQuery("
    SELECT o FROM AcmeCodeBundle:Orders o
    WHERE 
      o.OrderEmail = '[email protected]' AND
      o.Product LIKE 'My Products%'
");
$orders = $dql_query->getResult();

必要なことを正確に行う必要があります。

4
elcukro

実際には、doctrine誰があなたのリポジトリクラスであるか、そうでない場合、doctrineはあなたの代わりにデフォルトのリポジトリを使用します。

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

0
Marco