繁体   English   中英

Yii Framework 2.0 Active Record选择具有特定条件的记录

[英]Yii framework 2.0 Active Record select records with a certain condition

使用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是一个基团,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中 我想避免检索所有记录,而只想检索没有键对的记录。 我怎样才能做到这一点?

试试下面的代码

代替 :

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

采用 :

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

使用此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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM