14

我经常遇到这个问题。。

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

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

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

性能和脏代码不是很糟糕..

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

我真正想要的是......一些类似的函数,如果它是单列,则为我提供数组中的列值,或者如果多列,则以列名作为索引的数组。

所以我想做的是通过扩展 ActiveRecord 或类似的东西来实现它,我想检查的是是否有人已经实现了类似的东西,或者对它有一些想法..:)

4

6 回答 6

15

您必须深入研究 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 也是一个数组输出。

于 2012-07-20T05:08:59.157 回答
14

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

User::find()->select(['field1', 'field2']);
于 2015-04-10T04:00:35.067 回答
11

正如我所说,我创建了行为,它的工作方式是:

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

**returns array('rajat@gmail.com','rajatsinghal@gmail.com')..**

现在不需要遍历所有活动记录并收集数组中的列,然后继续,并且还承担加载整列的重量..

你可以在 git 上找到扩展 .. https://github.com/rajatsinghal/CAdvancedArFindBehavior

于 2012-07-20T05:14:05.427 回答
6

这也可以在没有任何行为或没有添加到 CActiveRecord 的情况下工作。不过,我也喜欢这种行为的解决方案。

$active_users_emails=CHtml::listData(User::model()->findAllByAttributes(array('active'=>1)), 'id', 'email');
于 2013-03-12T09:22:57.390 回答
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"}]
于 2015-04-17T07:55:10.793 回答
1

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

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

$emailIds = array_column( $emailIds, 'email' ) );
于 2018-02-12T13:59:55.640 回答