->asArray() а где ->asObject()?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

->asArray() а где ->asObject()?

Сообщение BalykhinAS »

как то привычнее работать с объектами но ->asObject() не нашел? Действительно нет или не досмотрел?
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: ->asArray() а где ->asObject()?

Сообщение someweb »

ActiveRecord::find() возвращает объекты.
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: ->asArray() а где ->asObject()?

Сообщение BalykhinAS »

someweb писал(а): 2018.02.05, 16:08 ActiveRecord::find() возвращает объекты.
то есть можно выбрать с таблицы строки в виде объектов? У меня не вышло)

в pdo есть возможность извлечь строки в виде объекта http://php.net/manual/ru/pdostatement.fetchobject.php
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: ->asArray() а где ->asObject()?

Сообщение maleks »

Wizard писал(а): 2018.02.05, 19:47 то есть можно выбрать с таблицы строки в виде объектов? У меня не вышло)
ActiveRecord и соответственно ActiveQuery используйте.
А для тех pdo выборок, если вдруг надо, то у datareader есть метод setFetchMode
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: ->asArray() а где ->asObject()?

Сообщение BalykhinAS »

как то так получил желаемый результат
$products = Yii::$app->db->createCommand('SELECT id, name, price FROM c_products LIMIT 1')
->queryAll(5);
было бы не плохо иметь возможность установить $fetchMode и в Query
public function all($db = null)
{
if ($this->emulateExecution) {
return [];
}
$rows = $this->createCommand($db)->queryAll();
return $this->populate($rows);
}
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: ->asArray() а где ->asObject()?

Сообщение BalykhinAS »

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

        $products = (new Query())
            ->select('id, name, price')
            ->from('c_products')
            ->orderBy('RAND()')
            ->limit(5)->createCommand()->queryAll(5);
такой вариант тоже отдает stdClass
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: ->asArray() а где ->asObject()?

Сообщение urichalex »

Wizard писал(а): 2018.02.05, 21:02

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

        $products = (new Query())
            ->select('id, name, price')
            ->from('c_products')
            ->orderBy('RAND()')
            ->limit(5)->createCommand()->queryAll(5);
такой вариант тоже отдает stdClass

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

$products = Product::find()->all();
Отдаст массив с объектами Product
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: ->asArray() а где ->asObject()?

Сообщение BalykhinAS »

urichalex писал(а): 2018.02.05, 21:32
Wizard писал(а): 2018.02.05, 21:02

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

        $products = (new Query())
            ->select('id, name, price')
            ->from('c_products')
            ->orderBy('RAND()')
            ->limit(5)->createCommand()->queryAll(5);
такой вариант тоже отдает stdClass

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

$products = Product::find()->all();
Отдаст массив с объектами Product
да, но для этого необходимо создать модель Product
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: ->asArray() а где ->asObject()?

Сообщение BalykhinAS »

не знаю, возможно наколхозил но мне как то удобное работать с объектами вместо массивов

еще один вариант)))
class Query extends \yii\db\Query
{
public function allClass($db = null)
{
if ($this->emulateExecution) {
return [];
}
$rows = $this->createCommand($db)->queryAll(5);
return $this->populate($rows);
}
}
$products = (new Query())
->select('id, name, price')
->from('c_products')
->limit(5)
->allClass();
Последний раз редактировалось BalykhinAS 2018.02.05, 21:54, всего редактировалось 1 раз.
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: ->asArray() а где ->asObject()?

Сообщение BalykhinAS »

просто получается что PDOStatement::setFetchMode предусмотрен, но что бы (даже если и в частных случаях как мой) воспользоваться им надо искать варианты вместо того что бы просто воспользоваться в том же Query
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: ->asArray() а где ->asObject()?

Сообщение urichalex »

Можно вообще не использовать Yii, если не нравятся ее подходы или если от фреймворка нужны только хелперы.
Есть Doctrine есть другие инструменты для работы с бд.
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: ->asArray() а где ->asObject()?

Сообщение BalykhinAS »

urichalex писал(а): 2018.02.05, 21:49 Можно вообще не использовать Yii, если не нравятся ее подходы или если от фреймворка нужны только хелперы.
Есть Doctrine есть другие инструменты для работы с бд.
можно, вопрос ведь не в том использовать или нет, суть в том что кто то работает с массивами а кому то удобное работать с объектами (stdClass). Опять же, возникает потребность выбрать записи из базы без использования моделей, но при этом работать с stdClass вместо array

Фреймворк на то и нужен что бы гибко с ним работать :)
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: ->asArray() а где ->asObject()?

Сообщение urichalex »

Wizard писал(а): 2018.02.05, 21:54
urichalex писал(а): 2018.02.05, 21:49 Можно вообще не использовать Yii, если не нравятся ее подходы или если от фреймворка нужны только хелперы.
Есть Doctrine есть другие инструменты для работы с бд.
можно, вопрос ведь не в том использовать или нет, суть в том что кто то работает с массивами а кому то удобное работать с классами. Опять же, возникает потребность выбрать записи из базы без использования моделей
Yii такой инструмент. Кто выбрал Yii в принципе подписался на модели, сценарии, статику...
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: ->asArray() а где ->asObject()?

Сообщение urichalex »

Wizard писал(а): 2018.02.05, 21:54
urichalex писал(а): 2018.02.05, 21:49 Можно вообще не использовать Yii, если не нравятся ее подходы или если от фреймворка нужны только хелперы.
Есть Doctrine есть другие инструменты для работы с бд.
можно, вопрос ведь не в том использовать или нет, суть в том что кто то работает с массивами а кому то удобное работать с объектами (stdClass). Опять же, возникает потребность выбрать записи из базы без использования моделей, но при этом работать с stdClass вместо array

Фреймворк на то и нужен что бы гибко с ним работать :)
За гибкостью - это не к Yii =)
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: ->asArray() а где ->asObject()?

Сообщение BalykhinAS »

вариант для моделей

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

        $products = Product::find()
            ->select('id, name, price')
            ->limit(10)
            ->createCommand()
            ->queryAll(5);
на выходе stdClass вместо массива

правда некоторые плюшки не доступны при таком подходе
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: ->asArray() а где ->asObject()?

Сообщение urichalex »

Wizard писал(а): 2018.02.05, 22:51 вариант для моделей

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

        $products = Product::find()
            ->select('id, name, price')
            ->limit(10)
            ->createCommand()
            ->queryAll(5);
на выходе stdClass вместо массива

правда некоторые плюшки не доступны при таком подходе
Использовать модель для того, чтобы использовать ее как кверибилдер?
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: ->asArray() а где ->asObject()?

Сообщение BalykhinAS »

urichalex писал(а): 2018.02.05, 22:59
Wizard писал(а): 2018.02.05, 22:51 вариант для моделей

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

        $products = Product::find()
            ->select('id, name, price')
            ->limit(10)
            ->createCommand()
            ->queryAll(5);
на выходе stdClass вместо массива

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

все равно не пойму почему только массив!? ((
mkramer
Сообщения: 531
Зарегистрирован: 2014.12.14, 13:02

Re: ->asArray() а где ->asObject()?

Сообщение mkramer »

А что, createCommand() вызвать - это гиперсложно?
BalykhinAS
Сообщения: 179
Зарегистрирован: 2018.02.05, 13:41
Контактная информация:

Re: ->asArray() а где ->asObject()?

Сообщение BalykhinAS »

mkramer писал(а): 2018.02.06, 14:49 А что, createCommand() вызвать - это гиперсложно?
не то что бы сложно...
$models = $query->offset($pages->offset)
->select('id, store_id, name, price')
->with(['store' => function (\yii\db\ActiveQuery $query) {
$query->select('id, name');
}])
->with(['images' => function (\yii\db\ActiveQuery $query) {
$query->select('id, product_id, store_id, filename, object');
}])
->limit($pages->limit)
->asArray()
->all();
вот к примеру мне хотелось бы без костылей выбрать товары но так что бы хотябы вместо массива был sdtClass а в идеале задать класс вручную или оставить, к примеру, изображений без изминений
Ответить