Подтвердить что ты не робот

Yii выбор только определенных атрибутов в массиве

Я часто сталкиваюсь с этой проблемой.

Давайте скажем.. В приложении для блога мне нужно отправить всем активным пользователям по электронной почте.

Что я делаю, так это написать findAll для пользователей с некоторыми условиями их последнего входа больше, чем какое-либо значение.. и получить все объекты User... Затем запустите foreach через все объекты модели пользователя и сохраните электронные письма в массиве, затем используйте массив.

Другими словами, что происходит в back-end, я загружаю целую модель, в то время как мне нужна только 0.5% этой информации, а затем запускать грязный код для получения значений в массиве, а затем обрабатывать его..

Разве это не плохо в производительности и грязном коде.

Теперь другой подход, о котором я могу думать, использует commandBuilder и записывает запрос, а затем запускает тот же грязный код для получения значений в массиве. Одна проблема с производительностью разрешена. Но, как говорят люди, написав sql в mvc frameworks, нет действительно хорошая идея.

Что мне действительно нужно... некоторые подобные функции, которые дают мне значения столбцов в массиве, если это один столбец, или массив с именем столбца в качестве индекса, если несколько столбцов..

Итак, что я думаю о том, чтобы реализовать это, расширив ActiveRecord или что-то подобное, , что я хочу проверить, если кто-то уже реализовал что-то подобное или имеет некоторые идеи для него..:)

4b9b3361

Ответ 1

Я создал поведение, как я сказал, как он работает:

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

**returns array('[email protected]','[email protected]')..**

Теперь вам не нужно проходить все активные записи и собирать столбец в массиве, затем продолжить, а также нести массу загрузки целого колонка..

Вы можете найти расширение на git.. https://github.com/rajatsinghal/CAdvancedArFindBehavior

Ответ 2

Вы должны изучить 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 также является выходным массивом.

Ответ 3

В Yii2 вы можете использовать следующее:

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

Ответ 4

Это также будет работать без какого-либо поведения или без добавления в CActiveRecord. Тем не менее мне также нравится решение с поведением.

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

Ответ 5

Необходимо фильтровать атрибуты модели с помощью функции 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]"}]