Yii выбор только определенных атрибутов в массиве
Я часто сталкиваюсь с этой проблемой.
Давайте скажем.. В приложении для блога мне нужно отправить всем активным пользователям по электронной почте.
Что я делаю, так это написать findAll для пользователей с некоторыми условиями их последнего входа больше, чем какое-либо значение.. и получить все объекты User... Затем запустите foreach через все объекты модели пользователя и сохраните электронные письма в массиве, затем используйте массив.
Другими словами, что происходит в back-end, я загружаю целую модель, в то время как мне нужна только 0.5%
этой информации, а затем запускать грязный код для получения значений в массиве, а затем обрабатывать его..
Разве это не плохо в производительности и грязном коде.
Теперь другой подход, о котором я могу думать, использует commandBuilder
и записывает запрос, а затем запускает тот же грязный код для получения значений в массиве. Одна проблема с производительностью разрешена. Но, как говорят люди, написав sql в mvc frameworks, нет действительно хорошая идея.
Что мне действительно нужно... некоторые подобные функции, которые дают мне значения столбцов в массиве, если это один столбец, или массив с именем столбца в качестве индекса, если несколько столбцов..
Итак, что я думаю о том, чтобы реализовать это, расширив ActiveRecord или что-то подобное, , что я хочу проверить, если кто-то уже реализовал что-то подобное или имеет некоторые идеи для него..:)
Ответы
Ответ 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]"}]