【问题标题】:Rearranging active record elements in Yii在 Yii 中重新排列活动记录元素
【发布时间】:2011-09-17 02:24:48
【问题描述】:

我正在使用具有自己条件的 CDbCriteria 和 & 顺序子句。但是,我想给数组中元素的顺序太复杂了,无法在 order 子句中指定。

我想到的解决方案包括使用像这样定义的标准获取活动记录

$theModelsINeed = MyModel::model()->findAll($criteria); 

然后从我的 php 代码中重新排列顺序。我怎样才能做到这一点?我的意思是,我知道如何迭代它的元素,但我不知道是否有可能真正改变它们。

我一直在研究关于填充活动记录的 this 链接,但这似乎很复杂,也许有人可以提供一些更好的建议。

谢谢

【问题讨论】:

    标签: activerecord yii


    【解决方案1】:

    Yii 的活跃记录并没有什么特别之处。 find 系列方法将返回一个对象数组,您可以像 PHP 中的任何其他数组一样对该数组进行排序。

    如果您有复杂的排序标准,这意味着最好的工具可能是usort。由于您将处理对象,因此您的用户定义的比较函数将如下所示:

    function compare($x, $y)
    {
        // First sort criterion: $obj->Name
        if ($x->Name != $y->Name) {
            return $x->Name < $y->Name ? -1 : 1; // this is an ascending sort
        }
    
        // Second sort criterion: $obj->Age
        if ($x->Age != $y->Age) {
            return $x->Age < $y->Age ? 1 : -1; // this is a descending sort
        }
    
        // Add more criteria here
    
        return 0; // if we get this far, the items are equal
    }
    

    【讨论】:

      【解决方案2】:

      如果你确实想得到一个数组作为结果,你可以使用这个方法来获取支持 dbCriteria 的数据:

      $model = MyModel::model()->myScope();
      $model->dbCriteria->condition .= " AND date BETWEEN :d1 AND :d2";
      $model->dbCriteria->order = 'field1 ASC, field2 DESC';
      $model->dbCriteria->params = array(':d1'=>$d1, ':d2'=>$d2);
      
      $theModelsINeed = $model->getCommandBuilder()
          ->createFindCommand($model->tableSchema, $model->dbCriteria)
          ->queryAll();
      

      上面的例子展示了使用定义的范围和使用命名参数修改条件。

      如果您不需要 Active Record,您也可以查看 Query Builder,但是当我想使用 AR 但需要一个数组作为结果时,上述方法对我来说效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-23
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        相关资源
        最近更新 更多