【问题标题】:orWhere has disappeared in zf2. How to replace it?orWhere在zf2中消失了。如何更换它?
【发布时间】:2012-11-19 16:53:46
【问题描述】:

从 zf2 开始,使用 Zend\Db 查询 orWhere 不再可能 我在这里 (ZF2 How to orWhere()) 发现可以替换它。 在我的示例中,没有“喜欢”,只有一个类似的查询:

$select->where("....")->orWhere("...")

如果使用 PredicateSet 是唯一的方法,我该如何使用它来进行查询?

【问题讨论】:

    标签: zend-framework2


    【解决方案1】:

    最简单的方法是使用流利的表示法:

    $where = new Zend\Db\Sql\Where;
    $where->OR->equalTo('id', $id);
    

    如有疑问,请查看 Ralph 在其 Zend_Db-Examples 存储库 (https://github.com/ralphschindler/Zend_Db-Examples) 中发布的示例。

    【讨论】:

      【解决方案2】:

      orPredicate 可以用于 Where(),如下所示:

      public function fetchLike($keyword)
      {
          $where = new \Zend\Db\Sql\Where();
          $pred_url      = new \Zend\Db\Sql\Predicate\Like('url', '%' . $keyword . '%');
          $pred_notes    = new \Zend\Db\Sql\Predicate\Like('notes', '%' . $keyword . '%');
          $pred_username = new \Zend\Db\Sql\Predicate\Like('username', '%' . $keyword . '%');
          $where->orPredicate($pred_url)->orPredicate($pred_notes)->orPredicate($pred_username);
      
          $resultSet = $this->tableGateway->select($where);
      
          return $resultSet;
      }
      

      当然,您可以使用 lessThanOrEqualToequalTo 等谓词代替我使用的那种谓词。您也可以使用 andPredicate 代替 orPredicate

      Click here for ZF2's info on predicates

      另外,最好以正确的方式使用命名空间;

      use \Zend\Db\Sql\Predicate\Like;
      use \Zend\Db\Sql\Where;
      // Now you can use code like this:
      $pred_url      = new Like('url', '%' . $keyword . '%');
      // Instead of
      $pred_url      = new \Zend\Db\Sql\Predicate\Like('url', '%' . $keyword . '%');
      

      【讨论】:

        【解决方案3】:

        现在称为orPredicate() 参见Zend\Db\Sql\Predicate\Predicate.php 中的代码

        另请参阅有关where() 函数的Zend\Db\Sql\Select 文档,您可以传递第二个参数来定义ANDOR 的组合

        【讨论】:

        • 谢谢我在 PredicateSet.php 中找到了 orPredicate() 函数,但我不知道如何使用它。我没有找到任何可以在 Predicate.php 中使用的信息(这似乎是用于 like()、equalTo() 等函数,但找不到简单的 orWhere)。
        【解决方案4】:

        对于你的例子,如果你不使用 LIKE,你可以这样做(我自己正在寻找一个解决方案):

            $select->where(
                array(
                    new \Zend\Db\Sql\Predicate\PredicateSet(array(
                        new \Zend\Db\Sql\Predicate\Operator('first_column', \Zend\Db\Sql\Predicate\Operator::OPERATOR_EQUAL_TO, $some_value),
                        new \Zend\Db\Sql\Predicate\Operator('second_column', \Zend\Db\Sql\Predicate\Operator::OPERATOR_EQUAL_TO, $some_value)
                        /* even more columns to compare this way... */
                    ), 
                    \Zend\Db\Sql\Predicate\PredicateSet::COMBINED_BY_OR)
                )
            );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-06
          • 2011-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-05
          • 2019-10-15
          相关资源
          最近更新 更多