1

我正在开发一个 Symfony 1.4 项目,需要自定义一个后端过滤器“name”,以便同时搜索“name_full”列和“name”列。

我想在我的 FormFilterClass 中这样做:

public function addNameColumnQuery(Doctrine_Query $query, $field, $value) {

    $rootAlias = $query->getRootAlias();
    return $query->where(''.$rootAlias.'.name LIKE ?', "%$value%")
                 ->orWhere(''.$rootAlias.'.name_full LIKE ?', "%$value%");
}

但这不起作用,因为它给了我一个错误的结果集。而且我找不到可以转储完整 dql 以进行调试的文件。

请指出我可以在哪里转储完整的 dql,甚至告诉我我的方法有什么问题。

谢谢!

编辑:这是 Michal 建议并由我调整的正确功能:

public function addNameColumnQuery(Doctrine_Query $query, $field, $value)
{
    $rootAlias = $query->getRootAlias();
    return  $query->addWhere(
        ''.$rootAlias.'.name LIKE ? OR '.$rootAlias.'.name_full LIKE ?',
        array($value, $value)
    );
}
4

1 回答 1

2

尝试将其更改为:

$query->addWhere(
    '$rootAlias.'.name LIKE ? OR '.$rootAlias.'.name_full LIKE ?',
    array("%$value%", "%$value%")
);

通过使用->where()覆盖查询的整个 where 部分,您可以删除在addNameColumnQuery调用函数之前应用的一些条件。此外,通过使用上述语句,您将确保连接的两个条件OR在括号中,因此您将拥有

condition1 AND condition2 AND (name LIKE '' OR name LIKE '')

不是

condition1 AND condition2 AND name LIKE '' OR name LIKE ''
于 2013-12-02T08:53:48.047 回答