Как записать данные в таблицу базы данных когда данные суммированы?

Добрый день, у меня вопрос. С такой задачей я сталкиваюсь не так часто, но все же задача с точки зрения теории проста... но я не могу понять как правильно решить задачу...
Есть таблица с значениями, в таблице два поля.
5b20beb6ca25a813621565.png
Дальше я делаю запрос в базу данных для выборки. Суммирую поля да бы получить целое число.
public static function checkMyBonus( $user_id )
		{
			return UserMainPersonalBonus ::find()
										 -> where( [ 'user_id' => $user_id ] )
										 -> select(
											 '
											SUM(count_events_week) as count_events_week,
											SUM(count_time_for_conf_room) as count_time_for_conf_room,
											SUM(count_time_for_massage) as count_time_for_massage,
				'
										 )
										 -> groupBy( 'user_id' )
										 -> all();
		}

Но теперь стала задача, нужно перезаписывать значения полей, с одним полем то еще ладно. Нашел - отдал - записал.
Но тут два поля, допустим, поля где значения 2 и 4. В запрос пришло значение 3 к примеру. Нужно записать так что бы в полях отнялось 3. Тобишь осталось 0 и 1
Стандартная разметка обновления такова.
public static function updateMyBonus( $user_id, $count_events_week = NULL, $count_time_for_massage = NULL, $count_time_for_conf_room = NULL )
		{
			$model = UserMainPersonalBonus::findOne( $user_id );

			$old_count_events_week = $model -> count_events_week - $count_events_week;
			$old_count_time_for_massage = $model -> count_time_for_massage - $count_time_for_massage;
			$old_count_time_for_conf_room = $model -> count_time_for_conf_room - $count_time_for_conf_room;

			if( !empty( $count_events_week ) )
			{
				$model -> count_events_week = $old_count_events_week;
			}
			if( !empty( $count_time_for_massage ) )
			{
				$model -> count_time_for_massage = $old_count_time_for_massage;
			}
			if( !empty( $count_time_for_conf_room ) )
			{
				$model -> count_time_for_conf_room = $old_count_time_for_conf_room;
			}
			if( !$model -> save() )
			{
				dd( $model -> errors );
			}
		}

Насколько я понимаю сюда нужно отдать id записи, после чего отдать в запрос с id_user. И по нему искать. Или как еще подумал, что может искать по самому меньшему значению таблицы, если значение 0, то переходить к другой записи. Если значений нет, так юзеру об этом и сказать...
Буду рад любому совету... у меня голова не варит:((
  • Вопрос задан
  • 49 просмотров
Решения вопроса 1
Jhon_Light
@Jhon_Light Автор вопроса
Спустя пару часов пришел к такому выводу. (Это пример для одного поля, у меня их 5, другие аналогичные, ограничиваемся только воображением)
Сначала изобразил схему на листе ручкой, дальше дело техники.
public static function updateMyBonus( $user_id, $count_events_week = NULL, $count_time_for_massage = NULL, $count_time_for_conf_room = NULL )
		{
			$model = self ::updateBonus( $user_id );
			// Если данные которые пришли в $count_events_week меньше чем в базе.
			// То передаем ее дальше и отнимаем от уже существующего значения в базе
			if( $count_events_week < $model -> count_events_week )
			{
				// Пример 3 - 2 = 1
				// Отнимаем от значений в базе значене $count_events_week
				$old_data_value = $model -> count_events_week - $count_events_week;
				// записываем
				$model -> count_events_week = $old_data_value;
				// сохраняем
				$model -> save();
			}
			// если данные в $count_events_week равны значению которые в базе. Пишем чистый ноль без лишних движений
			elseif($count_events_week == $model -> count_events_week)
			{
				// Пример 3 = 3 пишем ноль
				$model -> count_events_week = 0;
				$model -> save();
			}
			// Если же данные в $count_events_week больше занчения в базе у первого поля
			// То записываем ноль и снова вызываем функцию для вызов новой записи.
			else
			{
				// Для получения разницы отнимаем данные которые пришли в $count_events_week, от того что есть в базе
				//Пример: Пришло 7 В базе 4
				//  7 - 4 = 3 это наша разница
				$remainder = $count_events_week - $model -> count_events_week;
				//записываем ноль в первое поле
				$model -> count_events_week = 0;
				// сохраняем
				if( $model -> save() )
				{
					// Дальше вызываем снова туже самую функцию, но так как мы уже записал ноль в первое поле
					// Оно отдаст второе поле у которо поле не больше нуля
					$next_model = self ::updateBonus( $user_id );
					// Ранее полученую разницу отнимаем от основного значения которое хранит в себе второе поле
					// Пример: 4 - 3 = 1 
					$old_data_value = $next_model -> count_events_week - $remainder;
					// Сохраняем данные
					$next_model -> count_events_week = $old_data_value;
					$next_model -> save();
				}
			}
		}

		// С помощью этой функции мы и обращаемся к полям где значения больше нуля
		protected static function updateBonus( $user_id )
		{
			$row =  self ::find() -> where( [ 'user_id' => $user_id ] )
				          -> andWhere(['>','count_events_week',0])
						  -> orderBy( [ 'date_end' => SORT_ASC] )
 						  -> one();
			return $row;
		}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@iSensetivity
бухгалтер, програміст-самоук
А почему не сделать 1 запись?
Почему не передавать какие то дополнительньіе параметрьі при обновлении?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы