我经常遇到这个问题..
让我们说..在博客应用程序中,我需要通过电子邮件发送所有活跃用户..
我所做的是在用户上写一个findAll,其上一次登录的条件大于某个值...并获取所有用户对象...然后通过所有用户模型对象运行foreach并将数据存储在一个数组中,然后使用数组..
我说其他后端发生的事情是我正在加载整个模型,而我只需要0.5%
的那些信息,然后运行一个脏代码来获取数组中的值,然后处理用它..
性能和脏代码是不是很糟糕..
现在我能想到的另一种方法是使用commandBuilder
并编写查询,然后运行相同的脏代码来获取数组中的值..解决了性能问题..但是正如人们所说的在mvc框架中编写sql,这不是一个好主意..
我真正想要的......一些类似的函数,如果它是一个列,则在数组中给出列值;如果是多列,则列数列为索引的数组..
所以我想要做的是通过扩展ActiveRecord或类似的东西来实现它,我要检查的是,如果有人已经实现了类似的东西,或者有一些想法......:)
答案 0 :(得分:16)
你必须深入学习CDbCriteria,它们就是你所期待的一切。
举个例子::
$criteria = new CDbCriteria;
$criteria->select = 't.first_name, t.email'; // select fields which you want in output
$criteria->condition = 't.status = 1';
$data = Users::model()->findAll($criteria);
$ data也是数组输出。
答案 1 :(得分:12)
在Yii2中,您可以像这样使用:
User::find()->select(['field1', 'field2']);
答案 2 :(得分:11)
我按照我说的创建了行为,它的工作方式是:
$active_users_emails = User::model()->findColumn('email', 'active = 1');
**returns array('rajat@gmail.com','rajatsinghal@gmail.com')..**
现在一个人不需要经历所有活动记录并收集 数组中的列,然后继续,并承担整个加载的重量 柱..
你可以在git上找到扩展名。https://github.com/rajatsinghal/CAdvancedArFindBehavior
答案 3 :(得分:6)
这也可以在没有任何行为或没有添加到CActiveRecord的情况下工作。不过我也喜欢行为的解决方案。
$active_users_emails=CHtml::listData(User::model()->findAllByAttributes(array('active'=>1)), 'id', 'email');
答案 4 :(得分:2)
需要使用 array_filter 功能过滤模型属性。尝试这样,它的工作很棒 -
$criteria = new CDbCriteria;
$criteria->select = 't.first_name, t.email'; // select fields which you want in output
$criteria->condition = 't.status = 1';
$data = Users::model()->findAll($criteria);
在分配之前使用array_filter。
foreach($data as $model){
$rows[] = array_filter($model->attributes);
}
echo CJSON::encode($rows)
所以,你会得到这样的输出 -
[{"first_name" : "Rohit", "email" : "rohitsuthar@gmail.com"}, {"first_name" : "Rajat", "email" : "rajat@example.com"}]
答案 5 :(得分:0)
与问题描述的情况相同。 在尝试了所有上述答案和其他一些资源后,我正在做的事情。
$emailIds = Yii::app()->db->createCommand(
'SELECT email FROM users WHERE is_active = 1'
)->queryAll();
$emailIds = array_column( $emailIds, 'email' ) );