【问题标题】:Yii framework 2.0 Active Record select records with a certain conditionYii framework 2.0 Active Record 选择具有一定条件的记录
【发布时间】:2015-02-19 09:43:10
【问题描述】:

使用 Yii 框架 2.0,我有一个与此类似的数据库表。

---------------------------
| id | name  | key | type |
---------------------------
| 1  | John  | a   |   1  |
---------------------------
| 2  | Lisa  | a   |   2  |
---------------------------
| 3  | Tom   | b   |   1  |
---------------------------
| 4  | Smitt | b   |   2  |
---------------------------
| 5  | Linda | c   |   1  |
---------------------------
| 6  | Peter | d   |   1  |
---------------------------

注意记录1和2有相同的a键,记录3和4的b钥匙。我只想检索记录号 5 和 6,因为记录 1 和 2 是一个 a 组,3 和 4 是一个 b 组,5 没有密钥对,6 也没有密钥对。下面的结果就是我想要的。

---------------------------
| id | name  | key | type |
---------------------------
| 5  | Linda | c   |   1  |
---------------------------
| 6  | Peter | d   |   1  |
---------------------------

下面是我的模型。

class MyModel extends ActiveRecord {

    public function getModelItSelf() {
         return $this->hasOne(self::className(), ['key' => 'key'])->where(['type' => 2]);
    }

    public static function getSingleRecord() {
         $allMyModels = MyModel::find()->where(['type' => 1])->all();

         $arrMySingleModel = [];

         foreach($allMyModels as $myModel) {
              if(!$myModel->modelItSelf) {
                   $arrMySingleModel[] = $myModel;
              }                
         }

         return $arrMySingleModel;
    }

}

在我的控制器类中,我可以执行以下操作。

public function actionIndex() {

    $allSingleModel = MyModel::getSingleRecord();

}

这是我的解决方案,但如果您查看 getSingleRecord() 方法。我首先检索了所有类型为 1 的记录,然后在 foreach 循环中过滤它们并放入单个记录在数组 $arrMySingleModel 中。我想避免检索所有记录,只想检索没有密钥对的记录。我该怎么做?

【问题讨论】:

    标签: php mysql database activerecord yii2


    【解决方案1】:

    试试下面的代码

    而不是:

           $allMyModels = MyModel::find()->where(['type' => 1])->all();
    

    使用:

           $allMyModels =  MyModel::all(array('group' => 'key', 'having' => 'count( * ) = 1'));
    

    【讨论】:

      【解决方案2】:

      使用这个sql:

      SELECT COUNT(*) AS cnt, name
      FROM test
      GROUP BY `key`
      HAVING cnt =1 
      

      在 AR 中:

      MyModel::find()->select('count(*) as cnt, name')
                  ->groupBy('`key`')
                  ->having('cnt =1 ')
                  ->all();
      

      这样工作https://yadi.sk/i/dUsqj2yIemvpi, https://yadi.sk/i/kZIltpXZemvsB

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-24
        • 2011-01-28
        • 2015-01-04
        • 2012-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多