изменение поля при выборке

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

изменение поля при выборке

Сообщение kutuev93 »

Здравствуйте, вопрос касается выборки и activerecord вообще:

1. есть запрос полученный через парочку andFilterWhere
2. у модели есть дополнительное поле которое не относится к полям базы, просто public $pwl
3. нужно после выборки задать значения к этой переменной. в частности после выборки 1. нужно пробежаться форичем и запистаь кое какие данные
4. гайд советует сделать так:

$rooms = Room::find()
->select([
'{{room}}.*', // select all columns
'([[length]] * [[width]].* [[height]]) AS volume', // calculate a volume
])
->all();

где volume это как раз мое доп поле

Но проблема в том, что мне нужно сделать это через foreach (потому что будут условия if внутри цикла + нужно знать переменную цикла)

Казалось бы, возможно нужно мой результат выборки (1 пункт) пробежаться форичем и присвоить нужное значение (volume), но получаю нули
Не совсем понимаю, я думал результат выборки ссылочный тип поэтому я смогу налету изменить что мне нужно, но видимо это не так.
lgXenos
Сообщения: 243
Зарегистрирован: 2015.11.30, 15:42

Re: изменение поля при выборке

Сообщение lgXenos »

kutuev93 писал(а):2. у модели есть дополнительное поле которое не относится к полям базы, просто public $pwl
Ну еще в гайдах есть подсказки что можно делать геттеры

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

public function getPwl(){...} 
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: изменение поля при выборке

Сообщение Nerf »

+ afterFind()
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

lgXenos писал(а):
kutuev93 писал(а):2. у модели есть дополнительное поле которое не относится к полям базы, просто public $pwl
Ну еще в гайдах есть подсказки что можно делать геттеры

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

public function getPwl(){...}
через геттеры сеттеры не получится организовать, к сожалению, так как мне необходимо знать инкрементное число в цикле, это число будет влиять на результат данного поля
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: изменение поля при выборке

Сообщение Nerf »

kutuev93 писал(а):Казалось бы, возможно нужно мой результат выборки (1 пункт) пробежаться форичем и присвоить нужное значение (volume), но получаю нули
Не совсем понимаю, я думал результат выборки ссылочный тип поэтому я смогу налету изменить что мне нужно, но видимо это не так.
kutuev93 писал(а): через геттеры сеттеры не получится организовать, к сожалению, так как мне необходимо знать инкрементное число в цикле, это число будет влиять на результат данного поля
Код покажите.
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

Nerf писал(а):
kutuev93 писал(а):Казалось бы, возможно нужно мой результат выборки (1 пункт) пробежаться форичем и присвоить нужное значение (volume), но получаю нули
Не совсем понимаю, я думал результат выборки ссылочный тип поэтому я смогу налету изменить что мне нужно, но видимо это не так.
kutuev93 писал(а): через геттеры сеттеры не получится организовать, к сожалению, так как мне необходимо знать инкрементное число в цикле, это число будет влиять на результат данного поля
Код покажите.
$query = MyModel::find();
$query->andFilterWhere(['>', 'room_id', 1]);
$query->andFilterWhere(['>', 'games', 0]);
$query->orderBy(['points' => SORT_DESC]);

у MyModel есть доп поле как мы уже говорили volume

первая запись из выборки получает значение volume как 1000 / 1, вторая запись 1000 / 2, так же в цикле будет условие: если i > 100 то ничего не передавать volume
lgXenos
Сообщения: 243
Зарегистрирован: 2015.11.30, 15:42

Re: изменение поля при выборке

Сообщение lgXenos »

kutuev93 писал(а):первая запись из выборки получает значение volume как 1000 / 1, вторая запись 1000 / 2, так же в цикле будет условие: если i > 100 то ничего не передавать volume
Видимо статические переменные в помощь, как минимум
http://php.net/manual/ru/language.varia ... ope.static
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: изменение поля при выборке

Сообщение Евгений Емельянов »

$query = MyModel::find();
$query->andFilterWhere(['>', 'room_id', 1]);
$query->andFilterWhere(['>', 'games', 0]);
$query->orderBy(['points' => SORT_DESC]);
Чтобы получить именно выборку нужно сделать запрос, например:

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

$query->all()
Результат запроса перебираете в цикле

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

$n = 1;
foreach ($query as $model) {
    $n++;
    $model->pwl = 'value-'.$n;
}
потом смотрим результат:

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

VarDumper::dump($arr,2);
Если что, покажите полный код и выборки и цикла, в котором пытаетесь присвоить значения.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: изменение поля при выборке

Сообщение Nerf »

kutuev93 писал(а): $query = MyModel::find();
$query->andFilterWhere(['>', 'room_id', 1]);
$query->andFilterWhere(['>', 'games', 0]);
$query->orderBy(['points' => SORT_DESC]);

у MyModel есть доп поле как мы уже говорили volume

первая запись из выборки получает значение volume как 1000 / 1, вторая запись 1000 / 2, так же в цикле будет условие: если i > 100 то ничего не передавать volume
Код вашего неработающего foreach.
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

Nerf писал(а):
kutuev93 писал(а): $query = MyModel::find();
$query->andFilterWhere(['>', 'room_id', 1]);
$query->andFilterWhere(['>', 'games', 0]);
$query->orderBy(['points' => SORT_DESC]);

у MyModel есть доп поле как мы уже говорили volume

первая запись из выборки получает значение volume как 1000 / 1, вторая запись 1000 / 2, так же в цикле будет условие: если i > 100 то ничего не передавать volume
Код вашего неработающего foreach.
foreach ($query as $row)
{
$row->pwl= 50;
}

return $query;

начинаю с этого, но 50 не выводит ни в какую.
я возможно здесь делаю грубую ошибку, потому как состояние массива $query не меняется по сути, а может и должно меняться
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: изменение поля при выборке

Сообщение Евгений Емельянов »

kutuev93 писал(а):
Nerf писал(а):
kutuev93 писал(а): $query = MyModel::find();
$query->andFilterWhere(['>', 'room_id', 1]);
$query->andFilterWhere(['>', 'games', 0]);
$query->orderBy(['points' => SORT_DESC]);

у MyModel есть доп поле как мы уже говорили volume

первая запись из выборки получает значение volume как 1000 / 1, вторая запись 1000 / 2, так же в цикле будет условие: если i > 100 то ничего не передавать volume
Код вашего неработающего foreach.
foreach ($query as $row)
{
$row->pwl= 50;
}

return $query;

начинаю с этого, но 50 не выводит ни в какую.
я возможно здесь делаю грубую ошибку, потому как состояние массива $query не меняется по сути, а может и должно меняться
Вы свой $query дампили после выборки? Что в нем?
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

Евгений Емельянов писал(а):
kutuev93 писал(а):
Nerf писал(а): Код вашего неработающего foreach.
foreach ($query as $row)
{
$row->pwl= 50;
}

return $query;

начинаю с этого, но 50 не выводит ни в какую.
я возможно здесь делаю грубую ошибку, потому как состояние массива $query не меняется по сути, а может и должно меняться
Вы свой $query дампили после выборки? Что в нем?
формируются данные
object(yii\db\ActiveQuery)#97 (27) { ["sql"]=> NULL ["on"]=> NULL ["joinWith"]=> NULL ["select"]=> NULL ["selectOption"]=> NULL ["distinct"]=> NULL ["from"]=> array(1) ...и так далее, конкретных данных после этой выборки нет
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: изменение поля при выборке

Сообщение Евгений Емельянов »

object(yii\db\ActiveQuery)
это не результат выборки, а объект ActiveQuery, Вам же надо получить ActiveRecord. сделайте как я писал выше.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: изменение поля при выборке

Сообщение Nerf »

Попробуйте написать:

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

foreach ($query as $row) {
    $row->pwl= 50;
    echo 'Magic is here!';
    exit;
    return;
    die();
} 
;)
Потом предыдущий ответ посмотрите.
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: изменение поля при выборке

Сообщение Евгений Емельянов »

по сути просто не дописали запрос:

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

$query->all(); 
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

Евгений Емельянов писал(а):по сути просто не дописали запрос:

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

$query->all();
при добавлении $query->all(); и дальнейшем выводе я так же получаю activerecord объект
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: изменение поля при выборке

Сообщение Евгений Емельянов »

kutuev93 писал(а):
Евгений Емельянов писал(а):по сути просто не дописали запрос:

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

$query->all(); 
при добавлении $query->all(); и дальнейшем выводе я так же получаю activerecord объект
Ну как "так же"? Вот здесь Вы получали ActiveQuery объект запроса:

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

object(yii\db\ActiveQuery)#97 (27) { ["sql"]=> NULL ["on"]=> NULL ["joinWith"]=> NULL ["select"]=> NULL ["selectOption"]=> NULL ["distinct"]=> NULL ["from"]=> array(1)   
А теперь пишите, что получаете объекты моделей из БД - ActiveRecord. Ваше поле $pwl принадлежит модели ActiveRecord, поэтому этот объект и нужно изменять в цикле, а не ActiveQuery.
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

Евгений Емельянов писал(а):
kutuev93 писал(а):
Евгений Емельянов писал(а):по сути просто не дописали запрос:

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

$query->all(); 
при добавлении $query->all(); и дальнейшем выводе я так же получаю activerecord объект
Ну как "так же"? Вот здесь Вы получали ActiveQuery объект запроса:

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

object(yii\db\ActiveQuery)#97 (27) { ["sql"]=> NULL ["on"]=> NULL ["joinWith"]=> NULL ["select"]=> NULL ["selectOption"]=> NULL ["distinct"]=> NULL ["from"]=> array(1)     
А теперь пишите, что получаете объекты моделей из БД - ActiveRecord. Ваше поле $pwl принадлежит модели ActiveRecord, поэтому этот объект и нужно изменять в цикле, а не ActiveQuery.

извиняюсь, если не правильно вас понимаю, но:

.....
.....
$query->orderBy(['points' => SORT_DESC]);
$query->all();

var_dump($query);

Результат:

object(yii\db\ActiveQuery)#97 (27) { ["sql"]=> NULL ["on"]=> NULL ["joinWith"]=> NULL ["select"]=> NULL ["selectOption"]=> NULL ["distinct"]=> NULL ["from"]=> array(1).....
kutuev93
Сообщения: 75
Зарегистрирован: 2016.01.24, 18:15
Откуда: Тюмень

Re: изменение поля при выборке

Сообщение kutuev93 »

При VarDumper::dump($query,2 ); получаю
yii\db\ActiveQuery#1 ( [sql] => null [on] => null [joinWith] => null [select] => null [selectOption] => null [distinct] => null [
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: изменение поля при выборке

Сообщение Евгений Емельянов »

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

$query->orderBy(['points' => SORT_DESC]);
$models = $query->all();

var_dump($models);
 
Вы же результат выборки никуда не передали...
Ответить