как выбрать предыдущие значения из БД

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Zdraste
Сообщения: 6
Зарегистрирован: 2019.11.22, 04:17

как выбрать предыдущие значения из БД

Сообщение Zdraste »

Есть таблица reading.
В настоящее время я все поля формы, для записи в эту таблицу, заполняю вручную.
Поля следующие:
Reading::find()->select('id, user_id, manth_title, manth_pred, manth_tek, t_pred,t_tek, t_potr, tarif, t_summa')->where(['user_id'=>$id])->all();
Начиная с id пользователя, последовательно заполняю и заголовок, и названия месяцев, текущие и предыдущие показания счётчиков.... в общем всё, что в ней есть.
Решил облегчить себе труд.
Теперь часть полей заполняется "автоматически".

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

public function actionDemonstration()
    {   
       $model = new Reading();

        if ($model->load(Yii::$app->request->post()) && $model->validate()) {  
            // данные в $model загружены и удачно проверены
            $m = $model->manth_tek;
            $model->manth_title = $m; // Подставляем в заголовок введённое в поле формы  название текущего месяца
            $a = $model->t_tek;
            $b = $model->t_pred;
            $c = $a-$b;
            $model->t_potr = $c; // Кол-во потреблённой эл.энергии = разность  показаний
            $d = $model->tarif;
            $dc = $c * $d;
            $model->summa  =  $dc;// Сумма равна произведению потр. эл.энергии на тариф
            $model->save();  
           
            return $this->render('demonstration', ['model' => $model]);
        }
    }
Но хотелось бы большего. То есть вводить только id юзера, название текущего месяца, текущие показания счётчика и тариф.
То есть, чтобы t_pred и manth_pred "подставлялись" бы, как соответственно t_tek и manth_tek из прошлого месяца.
Пробовал всяко, но пока так и не осилил задачу.
Буду очень признателен, если кто подскажет.
unknownby
Сообщения: 749
Зарегистрирован: 2019.11.05, 16:34
Контактная информация:

Re: как выбрать предыдущие значения из БД

Сообщение unknownby »

То что ты сделал выглядит примерно вот так.

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

public function actionDemonstration()
    {   
       $model = new Reading();

        if ($model->load(Yii::$app->request->post()) && $model->validate()) { 
         	//уведомление о успешном создании или какое хочешь
		\Yii::$app->session->setFlash($this->flashClass, \Yii::t('main', 'flash.success'));
		//можно добавить переадресацию на страницу просмотра если надо
		return $this->redirect(Url::toRoute(['view', "model" => $model]));
        }
        return $this->render('demonstration', ['model' => $model]);
    }
В модели Reading

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

public function beforeSave($insert){
    	if($insert){
        	$this->manth_title = $this->manth_tek;
        	$this->t_potr = $this->t_tek - $this->t_pred; // Кол-во потреблённой эл.энергии = разность  показаний
        	$this->summa  =  $this->t_potr * $this->tarif;// Сумма равна произведению потр. эл.энергии на тариф
	}

        return true;
    }
Но задача описанная тобой вроде как не совсем то, что ты в коде показал.
У тебя написано "как выбрать предыдущие значения из БД". А это должен быть action() который принимает значение id которую ты создаешь впервые тут actionDemonstration().
Типо actionUpdate($id) и уже там значения подгружаются для обновления, а в beforeSave тогда указать

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

if($insert || (0 < count($this->dirtyAttributes)))
Для того, чтобы старые данные затирались новыми.
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как выбрать предыдущие значения из БД

Сообщение yiiliveext »

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

public function actionDemonstration()
    {   
       $model = new Reading();
       $previousMonthModel = Reading::find()->orderBy(['id' => SORT_DESC])->one(); //выбираем предыдущий месяц как последнюю запись (можно по другому критерию)
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {  
            // данные в $model загружены и удачно проверены
            $m = $model->manth_tek;
            $model->manth_title = $m; // Подставляем в заголовок введённое в поле формы  название текущего месяца
            $model->manth_pred = $previousMonthModel->manth_title;
            $a = $model->t_tek;
            $b = $previousMonthModel->t_tek;
            $c = $a-$b;
            $model->t_potr = $c; // Кол-во потреблённой эл.энергии = разность  показаний
            $d = $model->tarif;
            $dc = $c * $d;
            $model->summa  =  $dc;// Сумма равна произведению потр. эл.энергии на тариф
            $model->save();  
           
            return $this->render('demonstration', ['model' => $model]);
        }
    }
Именование переменных и полей у вас - тихий ужас.
Zdraste
Сообщения: 6
Зарегистрирован: 2019.11.22, 04:17

Re: как выбрать предыдущие значения из БД

Сообщение Zdraste »

Про ужас согласен! Есть такое дело.. Но я рассуждал как: мне ж его выкладывать, ( код этот), никуда не придётся, стало быть можно называть поля и переменные так, чтобы ЛИЧНО МНЕ удобно и понятно было.
А оно эвон, как всё обернулось..
К общему стыду добавляется и осознание своей полной "чайниковости" как в php в целом, так и в Yii2 в частности.
Но дороги назад нет. Сайт для СНТ нашего уже сделан ( Как дядюшка Тыква из "Чипполино" свой дом по кирпичикам, так и я по разным источникам нашкрябывая отдельные знания потихонечку его таки сделал)
И теперь я как могу ( а могу только по чудовищно дилетантски) его "апгрейдю".
Полгода назад я о таких вещах как php,css,html не знал вообще ничего. От слов абсолютно и совсем. И "клепание своего сайта" для меня просто хобби. Причём возникшее вначале по необходимости, а позже превратившееся в увлекательнейшее. Теперь практически всё свободное время ( а его не очень много, внучку в школу из школы да на секции вожу) трачу вот, на"самообразование" в этой области..
Но это всё лирика.
В очередной раз огромное Вам спасибо за консультацию!
То есть, если я ПРАВИЛЬНО понял, мне надо сначала первым экшеном создать объект модели с теми данными, которые я ввожу из формы ввода ( где через beforeSave подставляются значения, которые можно "создать" арифметическими операторами). А потом, во втором экшене, взяв из базы значения предыдущего объекта, подставить их в созданный в первом экшене так сказать "текущий" объект, и перезаписав всё это дело, сохранить уже как конечный результат?
Или я туплю, и понял всё не правильно? :oops:
Аватара пользователя
proctoleha
Сообщения: 298
Зарегистрирован: 2016.07.10, 19:00

Re: как выбрать предыдущие значения из БД

Сообщение proctoleha »

Вам написали как делать. Не надо никаких двух экшенов, и не мудрите с beforeSave(). Делайте как написал yiiliveext
Вот за что я не люблю линукс, так это за свои кривые, временами, руки
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как выбрать предыдущие значения из БД

Сообщение yiiliveext »

Zdraste писал(а): 2019.11.27, 23:34 То есть, если я ПРАВИЛЬНО понял, мне надо сначала первым экшеном создать объект модели с теми данными, которые я ввожу из формы ввода ( где через beforeSave подставляются значения, которые можно "создать" арифметическими операторами). А потом, во втором экшене, взяв из базы значения предыдущего объекта, подставить их в созданный в первом экшене так сказать "текущий" объект, и перезаписав всё это дело, сохранить уже как конечный результат?
Или я туплю, и понял всё не правильно? :oops:
Я все исправил прямо в вашем коде. Просто уберите из формы поля для ввода значений предыдущего месяца.
Этот запрос

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

$previousMonthModel = Reading::find()->orderBy(['id' => SORT_DESC])->one();
должен выбирать данные последнего месяца. Как точно будет выглядеть запрос, будет зависеть от того как у вас организовано хранение показателей. В данном случае просто выбирает последнюю запись из таблицы.
Usick
Сообщения: 42
Зарегистрирован: 2017.04.11, 12:07

Re: как выбрать предыдущие значения из БД

Сообщение Usick »

yiiliveext писал(а): 2019.11.28, 11:12 В данном случае просто выбирает последнюю запись из таблицы.
Если точнее, то запись с наибольшим id, а это не во всех случаях как говорят знающие люди будет последняя запись.

Вопрос - так ли это?
yiiliveext
Сообщения: 910
Зарегистрирован: 2019.08.13, 01:49

Re: как выбрать предыдущие значения из БД

Сообщение yiiliveext »

Usick писал(а): 2019.11.28, 12:23 Если точнее, то запись с наибольшим id, а это не во всех случаях как говорят знающие люди будет последняя запись.

Вопрос - так ли это?
Не всегда, но в большинстве случаев с автоинкрементируемым первичным ключом это так.
Zdraste
Сообщения: 6
Зарегистрирован: 2019.11.22, 04:17

Re: как выбрать предыдущие значения из БД

Сообщение Zdraste »

Всем огромнейшее спасибо!
Всё работает именно так, как мне и хотелось, а ГЛАВНОЕ - я понял принцип.
Теперь по двухтарифным счётчикам и всяким членско-целевым взносам уже сам разберусь, как там что и куда...
:)
Ответить