[英]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/dUsqj2yIemvpi , https://yadi.sk/i/kZIltpXZemvsB
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.