私はよくこの問題に直面します。
ブログアプリケーションで、アクティブユーザー全員にメールを送信する必要があるとします。
私がすることは、最後のログインがいくつかの値より大きいという条件のあるユーザーにfindAllを書いて、すべてのユーザーオブジェクトを取得します...次に、すべてのユーザーモデルオブジェクトに対してforeachを実行し、配列にメールを保存してから、配列.
つまり、バックエンドで起こっていることは、モデル全体をロードしていることですが、必要なのはかろうじて0.5%
その情報の次に、ダーティコードを実行して配列の値を取得し、それを処理します。
パフォーマンスや汚いコードがかなり悪いのではないですか。
今私が考えることができる他のアプローチはcommandBuilder
を使用してクエリを記述し、次に同じダーティコードを実行して配列の値を取得することです..パフォーマンスの問題の1つは解決されました。しかし、人々がmvcフレームワークでsqlを書くと言うように、本当に良いアイデアです。
私が本当に欲しいもの...単一の列の場合は配列の列値、または複数の列の場合はインデックスとして列名を持つ配列で列値を提供するいくつかの同様の関数。
だから私がやろうとしていることは、ActiveRecordまたは類似のものを拡張することでそれを実装することです私が確認したいのは、誰かがすでに類似のものを実装しているか、またはそれに何らかのアイデアがあるかどうかです..:)
私が言ったように私は動作を作成しました、それが機能する方法は次のとおりです:
$active_users_emails = User::model()->findColumn('email', 'active = 1');
**returns array('[email protected]','[email protected]')..**
これで、すべてのアクティブレコードを調べて配列内の列を収集してから続行する必要がなくなり、列全体をロードすることもできます。
拡張機能はgitで見つけることができます.. https://github.com/rajatsinghal/CAdvancedArFindBehavior
あなたは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も配列の出力です。
Yii2では、次のように使用できます。
User::find()->select(['field1', 'field2']);
これも動作せず、またはCActiveRecordに追加しなくても機能します。それにもかかわらず、私はその振る舞いを伴う解決策も気に入っています。
$active_users_emails=CHtml::listData(User::model()->findAllByAttributes(array('active'=>1)), 'id', 'email');
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" : "[email protected]"}, {"first_name" : "Rajat", "email" : "[email protected]"}]
質問と同じ状況で説明します。上記のすべての回答と他のリソースを試した後、ここで私がやっていることです。
$emailIds = Yii::app()->db->createCommand(
'SELECT email FROM users WHERE is_active = 1'
)->queryAll();
$emailIds = array_column( $emailIds, 'email' ) );