изменение поля при выборке
изменение поля при выборке
Здравствуйте, вопрос касается выборки и 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), но получаю нули
Не совсем понимаю, я думал результат выборки ссылочный тип поэтому я смогу налету изменить что мне нужно, но видимо это не так.
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), но получаю нули
Не совсем понимаю, я думал результат выборки ссылочный тип поэтому я смогу налету изменить что мне нужно, но видимо это не так.
Re: изменение поля при выборке
Ну еще в гайдах есть подсказки что можно делать геттерыkutuev93 писал(а):2. у модели есть дополнительное поле которое не относится к полям базы, просто public $pwl
Код: Выделить всё
public function getPwl(){...}
Re: изменение поля при выборке
+ afterFind()
Re: изменение поля при выборке
через геттеры сеттеры не получится организовать, к сожалению, так как мне необходимо знать инкрементное число в цикле, это число будет влиять на результат данного поляlgXenos писал(а):Ну еще в гайдах есть подсказки что можно делать геттерыkutuev93 писал(а):2. у модели есть дополнительное поле которое не относится к полям базы, просто public $pwlКод: Выделить всё
public function getPwl(){...}
Re: изменение поля при выборке
kutuev93 писал(а):Казалось бы, возможно нужно мой результат выборки (1 пункт) пробежаться форичем и присвоить нужное значение (volume), но получаю нули
Не совсем понимаю, я думал результат выборки ссылочный тип поэтому я смогу налету изменить что мне нужно, но видимо это не так.
Код покажите.kutuev93 писал(а): через геттеры сеттеры не получится организовать, к сожалению, так как мне необходимо знать инкрементное число в цикле, это число будет влиять на результат данного поля
Re: изменение поля при выборке
$query = MyModel::find();Nerf писал(а):kutuev93 писал(а):Казалось бы, возможно нужно мой результат выборки (1 пункт) пробежаться форичем и присвоить нужное значение (volume), но получаю нули
Не совсем понимаю, я думал результат выборки ссылочный тип поэтому я смогу налету изменить что мне нужно, но видимо это не так.Код покажите.kutuev93 писал(а): через геттеры сеттеры не получится организовать, к сожалению, так как мне необходимо знать инкрементное число в цикле, это число будет влиять на результат данного поля
$query->andFilterWhere(['>', 'room_id', 1]);
$query->andFilterWhere(['>', 'games', 0]);
$query->orderBy(['points' => SORT_DESC]);
у MyModel есть доп поле как мы уже говорили volume
первая запись из выборки получает значение volume как 1000 / 1, вторая запись 1000 / 2, так же в цикле будет условие: если i > 100 то ничего не передавать volume
Re: изменение поля при выборке
Видимо статические переменные в помощь, как минимум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);
Re: изменение поля при выборке
Код вашего неработающего foreach.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
Re: изменение поля при выборке
foreach ($query as $row)Nerf писал(а):Код вашего неработающего foreach.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
{
$row->pwl= 50;
}
return $query;
начинаю с этого, но 50 не выводит ни в какую.
я возможно здесь делаю грубую ошибку, потому как состояние массива $query не меняется по сути, а может и должно меняться
-
- Сообщения: 167
- Зарегистрирован: 2015.06.10, 10:43
Re: изменение поля при выборке
Вы свой $query дампили после выборки? Что в нем?kutuev93 писал(а):foreach ($query as $row)Nerf писал(а):Код вашего неработающего foreach.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
{
$row->pwl= 50;
}
return $query;
начинаю с этого, но 50 не выводит ни в какую.
я возможно здесь делаю грубую ошибку, потому как состояние массива $query не меняется по сути, а может и должно меняться
Re: изменение поля при выборке
формируются данныеЕвгений Емельянов писал(а):Вы свой $query дампили после выборки? Что в нем?kutuev93 писал(а):foreach ($query as $row)Nerf писал(а): Код вашего неработающего foreach.
{
$row->pwl= 50;
}
return $query;
начинаю с этого, но 50 не выводит ни в какую.
я возможно здесь делаю грубую ошибку, потому как состояние массива $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: изменение поля при выборке
это не результат выборки, а объект ActiveQuery, Вам же надо получить ActiveRecord. сделайте как я писал выше.object(yii\db\ActiveQuery)
Re: изменение поля при выборке
Попробуйте написать:
Потом предыдущий ответ посмотрите.
Код: Выделить всё
foreach ($query as $row) {
$row->pwl= 50;
echo 'Magic is here!';
exit;
return;
die();
}
Потом предыдущий ответ посмотрите.
-
- Сообщения: 167
- Зарегистрирован: 2015.06.10, 10:43
Re: изменение поля при выборке
по сути просто не дописали запрос:
Код: Выделить всё
$query->all();
Re: изменение поля при выборке
при добавлении $query->all(); и дальнейшем выводе я так же получаю activerecord объектЕвгений Емельянов писал(а):по сути просто не дописали запрос:Код: Выделить всё
$query->all();
-
- Сообщения: 167
- Зарегистрирован: 2015.06.10, 10:43
Re: изменение поля при выборке
Ну как "так же"? Вот здесь Вы получали ActiveQuery объект запроса:kutuev93 писал(а):при добавлении $query->all(); и дальнейшем выводе я так же получаю activerecord объектЕвгений Емельянов писал(а):по сути просто не дописали запрос:Код: Выделить всё
$query->all();
А теперь пишите, что получаете объекты моделей из БД - ActiveRecord. Ваше поле $pwl принадлежит модели ActiveRecord, поэтому этот объект и нужно изменять в цикле, а не ActiveQuery.Код: Выделить всё
object(yii\db\ActiveQuery)#97 (27) { ["sql"]=> NULL ["on"]=> NULL ["joinWith"]=> NULL ["select"]=> NULL ["selectOption"]=> NULL ["distinct"]=> NULL ["from"]=> array(1)
Re: изменение поля при выборке
Евгений Емельянов писал(а):Ну как "так же"? Вот здесь Вы получали ActiveQuery объект запроса:kutuev93 писал(а):при добавлении $query->all(); и дальнейшем выводе я так же получаю activerecord объектЕвгений Емельянов писал(а):по сути просто не дописали запрос:Код: Выделить всё
$query->all();
А теперь пишите, что получаете объекты моделей из БД - ActiveRecord. Ваше поле $pwl принадлежит модели ActiveRecord, поэтому этот объект и нужно изменять в цикле, а не ActiveQuery.Код: Выделить всё
object(yii\db\ActiveQuery)#97 (27) { ["sql"]=> NULL ["on"]=> NULL ["joinWith"]=> NULL ["select"]=> NULL ["selectOption"]=> NULL ["distinct"]=> NULL ["from"]=> array(1)
извиняюсь, если не правильно вас понимаю, но:
.....
.....
$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).....
Re: изменение поля при выборке
При VarDumper::dump($query,2 ); получаю
yii\db\ActiveQuery#1 ( [sql] => null [on] => null [joinWith] => null [select] => null [selectOption] => null [distinct] => null [
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);