私は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 **
これは、魔法の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();
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を変更する必要があります
またはさらに良い-エンティティのリポジトリクラスを作成し、そこにメソッドを作成します-これにより再利用可能になります
これはマジックメソッドでは不可能ですが、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();
必要なことを正確に行う必要があります。
実際には、doctrine誰があなたのリポジトリクラスであるか、そうでない場合、doctrineはあなたの代わりにデフォルトのリポジトリを使用します。
@ORM\Entity(repositoryClass = "Company\NameOfBundle\Repository\NameOfRepository")