Yii只选择数组中的指定属性

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也是一个数组输出.

  • 请清楚你的问题,我根据我的理解回答. (3认同)

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)