Doctrine2 QueryBuilder-字段名称中的变量



我试图将变量放入查询中的字段名称中,所以我有一个架构:

  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)

不会出错,但不应用商店过滤器。

这里的简短答案就是手动将商店名称工作到字符串中:

->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();

相关内容

  • 没有找到相关文章

最新更新