Преобразование обьекта в массив

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
ivan_freestyle
Сообщения: 7
Зарегистрирован: 2018.04.23, 11:24

Преобразование обьекта в массив

Сообщение ivan_freestyle »

Всем привет!

Есть таблица oblasti (oblast_id, oblast_name)

Код: Выделить всё

CREATE TABLE `oblasti` (
  `oblast_id` int(5) NOT NULL,
  `oblast_name` varchar(200) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


INSERT INTO `oblasti` (`oblast_id`, `oblast_name`) VALUES
(1, 'Адыгея Республика'),
(2, 'Башкортостан Республика'),
(3, 'Бурятия Республика'),
(4, 'Алтай Республика'),
(5, 'Дагестан Республика'),


ALTER TABLE `oblasti`
  ADD PRIMARY KEY (`oblast_id`);

После чего я сгенерил модель с использованием GII.
Мне необходимо преобразовать данные из модели Oblasti в массив!

Я нашел два способа, как можно это сделать:
1. Получение массива из объекта - https://www.yiiframework.com/doc/guide/ ... -to-arrays;
2. Используя CHtml::listData($models, 'id', 'name'); - здесь статья viewtopic.php?t=14552
https://github.com/yiisoft/yii/blob/mas ... .php#L2289;

----------------------------------------------------------------

В первом случае у меня код:

Код: Выделить всё

$data = ArrayHelper::toArray($model_2, [
	'app\modules\admin\models\Oblasti' => [
		'oblast_id' => 'oblast_id',
		'oblast_name' => 'oblast_name',
	],
]);
Выдается ошибка:

Код: Выделить всё

Array to string conversion
----------------------------------------------------------------

Во втором случае у меня код:

Код: Выделить всё

$data = CHtml::listData($model_2, 'oblast_id', 'oblast_name'); 
Выдается ошибка:

Код: Выделить всё

Cannot declare class CHtml, because the name is already in use
Чтобы использовать класс CHtml я сохранил с github его в папке "\htdocs\vendor\yiisoft\yii2\helpers"
и файле CHtml.php, но данный класс Yii ругается. Подскажите, как его объявить?

Просьба, в чем может быть проблема?
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: Преобразование обьекта в массив

Сообщение yan »

$model->getAttributes()
ivan_freestyle
Сообщения: 7
Зарегистрирован: 2018.04.23, 11:24

Re: Преобразование обьекта в массив

Сообщение ivan_freestyle »

yan писал(а): 2019.01.09, 13:16 $model->getAttributes()
Yan, спасибо за помощь. Я, конечно, люблю когда меня пинают в нужном направлении.
Но можно чуть больше информации или ссылки на ресурс.

$model->getAttributes() К какому способу относиться к первому или ко второму?
serega_chem
Сообщения: 12
Зарегистрирован: 2015.07.15, 14:26
Откуда: Саранск

Re: Преобразование обьекта в массив

Сообщение serega_chem »

$model->getAttributes() К какому способу относиться к первому или ко второму?
getAttributes - это метод, унаследованный от yii\base\Model

Код: Выделить всё

public function getAttributes($names = null, $except = [])
    {
        $values = [];
        if ($names === null) {
            $names = $this->attributes();
        }
        foreach ($names as $name) {
            $values[$name] = $this->$name;
        }
        foreach ($except as $name) {
            unset($values[$name]);
        }

        return $values;
    }
Загляните в исходный код класса Model
vikeng
Сообщения: 2
Зарегистрирован: 2014.11.07, 15:31

Re: Преобразование обьекта в массив

Сообщение vikeng »

ivan_freestyle писал(а): 2019.01.09, 12:25
Я нашел два способа, как можно это сделать:
1. Получение массива из объекта - https://www.yiiframework.com/doc/guide/ ... -to-arrays;
2. Используя CHtml::listData($models, 'id', 'name'); - здесь статья viewtopic.php?t=14552
https://github.com/yiisoft/yii/blob/mas ... .php#L2289;
Второй способ в yii2 работать не будет - он из yii 1-й версии.
Первый - должен работать.

Но в данном случае лучше 3-й - $model->getAttributes()
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Преобразование обьекта в массив

Сообщение andku83 »

Предполагаю что вам нужно получить список областей индексированных по id.
Вариант 1:

Код: Выделить всё

$list = app\modules\admin\models\Oblasti::find()->select(['oblast_name', 'oblast_id'])
	->orderBy(['oblast_name' => SORT_ASC])  // если нужно отсортировать
	->indexBy('oblast_id')->column();
Вариант 2:

Код: Выделить всё

$regions = app\modules\admin\models\Oblasti::find()
	->asArray()  // необязательно
	->orderBy(['oblast_name' => SORT_ASC])  // если нужно отсортировать
	->all();
$list  = \yii\helpers\ArrayHelper::map($regions, 'oblast_id', 'oblast_name');
Вариант 2.1 (если использовали ->asArray()):

Код: Выделить всё

$list = array_column($regions, 'oblast_name', 'oblast_id')
Аватара пользователя
andriel
Сообщения: 43
Зарегистрирован: 2017.12.05, 17:32

Re: Преобразование обьекта в массив

Сообщение andriel »

По вашим словам вы создали модель через Gii-генератор. То есть у вас есть модель Oblasti.

Чтобы обратиться в БД и выбрать все записи в виде массива делайте так

Код: Выделить всё

$oblasti = Oblasti::find()->asArray()->all();
Более детально читайте
https://yiiframework.com.ua/ru/doc/guid ... -in-arrays
Ответить