【发布时间】:2014-07-24 14:04:58
【问题描述】:
我需要用页面属性的过滤条件填充查询生成器。我得到了实体“页面”、“属性”和“值”
Page: id, name, etc
Attribute: id, name, etc
Value: page_id, date, string, numeric
我需要获取所有在表单中选择属性值的页面。
所以我得到了查询生成器:
$qb->select('p')
->from(Page p)
->leftJoin(p.values);
我可以使用“have”或“where”子句来做like吗?
$qb->add('having', 'a.id = :attr1_id AND a.value = :attr1_val')
$qb->add('having', 'a.id = :attr2_id AND a.value = :attr2_val')
更新:不,我不能。这样就可以得到 attr1_id = attr2_value AND attr2_id = attr1_value 的页面,并且所有条件都为真,但结果是错误的。
或者我应该为每个值添加自定义连接?
更新:这是工作示例:
//attr1.intval=:a1 (or LIKE, BETWEEN, etc compare)
$comp_expression=$aliace.'.'.$value_field.'=:a'.$this->getId();
//INNER JOIN attribute attr1 ON attr1.type=5 AND attr1.intval=:a1
$qb->innerJoin($value_class, $aliace , 'WITH', $aliace.'.type='.$this->getId().' AND '.$comp_expression);
//where attr1.intval IS NOT NULL
$qb->andWhere($aliace.'.'.$value_field.' IS NOT NULL');
$qb->setParameter('a'.$this->getId(),$value);
更新:所以进行键+值过滤的唯一方法是为每个过滤条件添加连接?我现在有 27 个属性,所以需要用 27 个连接构建查询吗?
还有其他更好的方法吗?抱歉,如果这是重复的,找不到关键字来查找相同的问题。
更新:也许我应该摆脱 sql 查询限制并为它创建 mysql 过程?
更新:我可以在教义中使用这样的东西吗? MySQL optimization on filtering key-value pairs as records
【问题讨论】:
-
您在搜索完全匹配给定属性的页面吗?包含 all 的给定属性;匹配 any 的给定属性;还是逻辑更复杂?
-
只匹配所有给定的属性
-
但值不能是 exec 匹配,而是 BETWEEN 表达式或 %LIKE%。 “values”表有日期、字符串和数字字段,在“属性”类中指定映射到值中的真实字段名称,所以它不是问题。
标签: php mysql sql doctrine-orm dql