Yii framework 2.0 Active Record选择具有一定条件的记录

时间:2015-02-19 09:43:11

标签: php mysql database activerecord yii2

使用Yii framework 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 中。我想避免检索所有记录,只想检索没有密钥对的记录。我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

尝试以下代码

而不是:

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

使用:

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

答案 1 :(得分:0)

使用此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/dUsqj2yIemvpihttps://yadi.sk/i/kZIltpXZemvsB

那样工作