我有一个包含很少自定义搜索字段的表单过滤器。
在addXXXQuery
函数中,我必须在一个表上使用join,这对于某些字段是相同的。
我可以检查该特定表的innerJoin是否已在另一个addXXXQuery
中设置?
[编辑]示例:
public function addIsPaidColumnQuery(Doctrine_Query $query, $field, $values)
{
if ($values) {
$rootAlias = $query->getRootAlias();
$query->leftJoin($rootAlias.".Inscription i");
->andWhere("i.is_paid = ?", $values);
}
}
public function addActTypeColumnQuery(Doctrine_Query $query, $field, $values)
{
if ($values) {
$rootAlias = $query->getRootAlias();
$query->leftJoin($rootAlias.".Inscription i")
->leftJoin("i.Act a")
$query->addWhere("a.act_type_id = ?", $values);
}
}
答案 0 :(得分:3)
好吧,你可以从查询中检索$params
,并检查连接是否已经存在,如下所示:
public function addIsPaidColumnQuery(Doctrine_Query $query, $field, $values)
{
if ($values)
{
$rootAlias = $query->getRootAlias();
$leftjoin = $rootAlias.".Inscription i";
$params = $query->getParams();
if (!isset($params['join']) || (isset($params['join']) && !in_array($leftjoin, $params)))
{
$query->leftJoin($leftjoin);
}
$query->andWhere("i.is_paid = ?", $values);
}
}
您可以在代码中看到how a leftJoin in added。
答案 1 :(得分:1)
我找不到一个方法,它会告诉我是否设置了表的连接。然而,我越是想到这种方法的存在,它对它的影响就越小。因此,为了检查我是否已在过滤器查询中使用了连接,我设置了一个类变量$leftJoinInscriptionSet
。
private $leftJoinInscriptionSet = false;
...
public function addIsPaidColumnQuery(Doctrine_Query $query, $field, $values)
{
if ($values) {
$this->setLeftJoinInscription($query);
$query->andWhere("i.is_paid = ?", $values);
}
}
...
private function setLeftJoinInscription(Doctrine_Query $query) {
if (!$this->leftJoinInscriptionSet) {
$rootAlias = $query->getRootAlias();
$query->leftJoin($rootAlias.".Inscription i");
$this->leftJoinInscriptionSet = true;
}
}