Php Yii仅选择数组中的指定属性

Php Yii仅选择数组中的指定属性,php,activerecord,yii,Php,Activerecord,Yii,我经常面临这个问题 比如说..在博客应用程序中,我需要给所有活跃用户发送电子邮件 我要做的是在用户上写findAll,这些用户上次登录的某些条件大于某个值..并获取所有用户对象..然后通过所有用户模型对象运行foreach并将电子邮件存储在数组中,然后使用数组 换句话说,在后端发生的事情是我加载整个模型,而我只需要0.5%的信息,然后运行脏代码来获取数组中的值,然后处理它 它的性能和脏代码不是很差吗 现在我能想到的另一种方法是使用commandBuilder编写查询,然后运行相同的脏代码以获取数

我经常面临这个问题

比如说..在博客应用程序中,我需要给所有活跃用户发送电子邮件

我要做的是在用户上写findAll,这些用户上次登录的某些条件大于某个值..并获取所有用户对象..然后通过所有用户模型对象运行foreach并将电子邮件存储在数组中,然后使用数组

换句话说,在后端发生的事情是我加载整个模型,而我只需要
0.5%
的信息,然后运行脏代码来获取数组中的值,然后处理它

它的性能和脏代码不是很差吗

现在我能想到的另一种方法是使用
commandBuilder
编写查询,然后运行相同的脏代码以获取数组中的值..解决了一个性能问题..但正如人们所说,在mvc框架中编写sql并不是一个好主意

我真正想要的是…一些类似的函数,如果是单列,则在数组中为我提供列值,如果是多列,则在数组中使用列名作为索引


所以我想做的是通过扩展ActiveRecord或类似的东西来实现它,我想检查的是,是否有人已经实现了类似的东西,或者对它有一些想法:)你必须深入研究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也是一个数组输出。

正如我所说,我创建了这个行为,其工作方式是:

$active_users_emails = User::model()->findColumn('email', 'active = 1');

**returns array('rajat@gmail.com','rajatsinghal@gmail.com')..**
现在人们不需要遍历所有的activerecords并收集它们 列,然后继续,并承担整个加载的重量 专栏


您可以在git上找到扩展。

这也可以在没有任何行为或不添加CActiveRecord的情况下工作。不过我也喜欢用行为解决问题

$active_users_emails=CHtml::listData(User::model()->findAllByAttributes(array('active'=>1)), 'id', 'email');

在Yii2中,您可以这样使用:

User::find()->select(['field1', 'field2']);

需要使用数组过滤器功能过滤模型属性。像这样试试,效果很好-

$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);

在分配前使用数组过滤器

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"}]

和问题描述的情况相同。 在尝试了以上所有答案和其他一些资源之后,我正在做的就是

$emailIds = Yii::app()->db->createCommand(
                 'SELECT email FROM users WHERE is_active = 1'
            )->queryAll();

$emailIds = array_column( $emailIds, 'email' ) );

这就是你要找的吗?他可能需要选择一些字段而不是所有字段。使用CDbCriteria::选择您需要的字段。请澄清您的问题,我根据我的理解回答。为什么设置为“t.first\u name”而不是“a.first\u name”。我试过“a.first_name”,但它和第一个不一样。这是某种约定吗?Alex,这是默认的表别名。Yii创建类似于“从表t中选择t.id”的查询,但根据查询的复杂性(多个表查询)可能会有所不同。勾选“移除别名”,该别名应为批准的别名answer@realtebo是的,这应该是经过批准的答案,但问题是询问yii1而不是YiI2您是否这样做
$data=User::find()->选择(['field1','field2'])然后打印$data->属性。您会发现表中的所有列都将为空值。