14

私はしばしばこの問題に直面します。

たとえば、ブログアプリケーションでは、すべてのアクティブユーザーにメールを送信する必要があります。

私がやっていることは、最後のログインのいくつかの条件がいくつかの値よりも大きいユーザーにfindAllを記述し、すべてのユーザーオブジェクトを取得することです...次に、すべてのユーザーモデルオブジェクトを介してforeachを実行し、電子メールを配列に格納してから、アレイ。

言い換えれば、バックエンドで起こっていることは、モデル全体をロードしているのに0.5%、その情報はほとんど必要ないのに、ダーティコードを実行して配列に値を取得し、それを処理することです。

パフォーマンスと汚いコードでかなり悪いではありませんか。

今私が考えることができる他のアプローチはcommandBuilder、クエリを使用して記述し、次に同じダーティコードを実行して配列の値を取得することです..パフォーマンスの1つの問題は解決されました..しかし、人々が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 に答える