2

クエリのフィールド名に変数を配置しようとしているので、スキーマがあります:

  id amazon - tesco - asda - happyshopper - 

  1   £5    - NULL  - NULL  -     £4.99
  2   NULL  - £2.99 - NULL  -     NULL

その後

$store = 'amazon'; 

$qb = $em->createQueryBuilder();
        $products = $qb->select('p')->from('MyBundle:Product', 'p')
        ->where('p.:store IS NOT NULL')
        ->setParameter('store', $store)
        ->add('orderBy', 'p.onSale DESC')
        ->setMaxResults(40)
        ->getQuery()
        ->getResult();

行1を返します。

私がしたこと:

->where('p.:store IS NOT NULL')
->setParameter('store', $store)

正しくなく、エラーです。

->where(':store IS NOT NULL')
->setParameter('store', $store)

エラーにはなりませんが、ストア フィルタは適用されません。

4

1 に答える 1

8

ここでの簡単な答えは、ストア名を文字列に手動で組み込むことです。

->where("p.$store IS NOT NULL")

また

->where('p.' . $store . ' IS NOT NULL')

長い答えは、データベーススキーマが何らかの作業を使用する可能性があるということです。たとえば、新しいストアを追加したい場合はどうなりますか?新しい列を追加して、すべてを再コーディングしますか?より良い解決策は、「ストア」の概念を分離し、それを独自のテーブルに配置し、すべてを別のテーブルに結合することです。このようなもの:

Product:
id | name | onSale
1  | foo  | 1
2  | bar  | 0

Store:
id | name    
1  | amazon
2  | tesco
3  | asda
4  | happyshopper

Price:
id | productId | storeId | price
1  | 1         | 1       | 5
2  | 1         | 4       | 4.99
3  | 2         | 2       | 2.99

テーブルとマッピングを適切に構成すると、クエリは次のようになります。

$qb = $em->createQueryBuilder();
$products = $qb
    ->select('product')
    ->from('MyBundle:Price', 'price')
    ->innerJoin('price.product', 'product')
    ->innerJoin('price.store', 'store')
    ->where('store.name = :store')
    ->setParameter('store', $store)
    ->add('orderBy', 'product.onSale DESC')
    ->setMaxResults(40)
    ->getQuery()
    ->getResult();
于 2012-10-24T17:02:33.023 に答える