Raj*_*hal 13 php activerecord yii
我经常遇到这个问题..
让我们说..在博客应用程序中,我需要通过电子邮件发送所有活跃用户..
我所做的是在用户上写一个findAll,其上一次登录的条件大于某个值...并获取所有用户对象...然后通过所有用户模型对象运行foreach并将数据存储在一个数组中,然后使用数组..
换句话说,后端正在发生的事情是我正在加载整个模型,而我只需要0.5%那些信息,然后运行一个脏代码来获取数组中的值,然后用它来处理..
性能和脏代码不是很糟糕..
现在我能想到的其他方法是使用commandBuilder和编写查询,然后运行相同的脏代码来获取数组中的值.解决了性能问题.但是正如人们所说的在mvc框架中编写sql,并不是一个好主意.
我真正想要的...一些类似的函数,如果它是一个列,则给出数组中的列值,或者如果有多列,则将列名作为索引的数组.
所以我想要做的是通过扩展ActiveRecord或类似的东西来实现它,我想要检查的是,是否有人已经实现了类似的东西,或者有一些想法... :)
Onk*_*nwa 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);
Run Code Online (Sandbox Code Playgroud)
$ data也是一个数组输出.
Zha*_*uzz 13
在Yii2中,您可以这样使用:
User::find()->select(['field1', 'field2']);
Run Code Online (Sandbox Code Playgroud)
Raj*_*hal 11
我按照我说的创建了行为,它的工作方式是:
$active_users_emails = User::model()->findColumn('email', 'active = 1');
**returns array('rajat@gmail.com','rajatsinghal@gmail.com')..**
Run Code Online (Sandbox Code Playgroud)
现在一个不需要遍历所有的activerecords并收集数组中的列,然后继续,并且还承担加载整列的重量.
你可以在git上找到扩展名.https://github.com/rajatsinghal/CAdvancedArFindBehavior
小智 6
这也可以在没有任何行为或没有添加到CActiveRecord的情况下工作.不过我也喜欢有行为的解决方案.
$active_users_emails=CHtml::listData(User::model()->findAllByAttributes(array('active'=>1)), 'id', 'email');
Run Code Online (Sandbox Code Playgroud)