1

我有一个带有几个自定义搜索字段的表单过滤器。

addXXXQuery函数中,我必须在某些字段相同的表上使用连接。

我可以检查该特定表的 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);
  }
}
4

2 回答 2

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

您可以在代码中看到leftJoin 是如何添加的

于 2013-01-30T12:41:52.293 回答
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;
  }
}
于 2013-01-30T14:47:09.713 回答