Обновление поля базы данных с помощью метода Joomla UpdateObject с вычисляемым полем из той же таблицы - PullRequest
0 голосов
/ 23 января 2019

Право на точку.

Мне нужно обновить поле в базе данных, используя поле, чтобы сначала вычислить новое значение.

Eg полей: https://i.stack.imgur.com/FADH6.jpg

Теперь я использую функцию Joomla updateObject. Моя цель - взять «потраченное» значение из таблицы БД без использования оператора выбора.

Затем мне нужно вычислить новое значение, например (потрачено + 10,00), и обновить поле новым значением. Проверьте код ниже:

// Create an object for the record we are going to update.
$object = new stdClass();

// Must be a valid primary key value.
$object->catid = $item['category'];
$object->spent = ($object->spent - $item['total']);

// Update their details in the users table using id as the primary key.
$result = JFactory::getDbo()->updateObject('#__mytable', $object, 'catid'); 

Бит, на котором мне нужно сделать расчет, равен

$object->spent = ($object->spent - $item['total']);

Я понимаю, что могу использовать отдельный оператор вставки, но мне интересно, есть ли лучший способ. Любая помощь очень ценится.

Это должно работать так: БЕЗ ВЫБРАТЬ (рабочий пример)

$query = $db->getQuery(true);
$query->select($db->quoteName('spent'));
$query->from($db->quoteName('#__mytable'));
$query->where($db->quoteName('catid')." = ". $item['category']);

// Reset the query using our newly populated query object.
$db->setQuery($query);
$oldspent = $db->loadResult();

// Create an object for the record we are going to update.
$object = new stdClass();

// Must be a valid primary key value.
$object->catid = $item['category'];
$object->spent = ($oldspent - $item['total']);

// Update their details in the users table using id as the primary key.
$result = JFactory::getDbo()->updateObject('#__mytable', $object, 'catid');  

1 Ответ

0 голосов
/ 23 января 2019

Камнем преткновения при попытке использовать updateObject('#__mytable', $object, 'catid'); является то, что вашей логике запроса необходимо ссылаться на имя столбца в расчете, чтобы назначить «разницу» в качестве нового значения.Синтаксис необработанного запроса MySQL для обновления значения столбца со значением минус другое значение выглядит следующим образом:

"`spent` = `spent` - {$item['total']}"

updateObject() преобразует spent - {$item['total']} в буквенную строку, база данных ожидает числовое значение, поэтомуОБНОВЛЕНИЕ приводит к записанному значению 0.Другими словами, $db->getAffectedRows() даст вам положительный счет, и не будет сгенерированных ошибок, но вы не получите нужного математического действия.

Обходной путь - отбросить updateObject() как инструмент исоздайте запрос UPDATE без объектов - не волнуйтесь, он не слишком запутанный.Я встроу некоторые средства диагностики и проверки ошибок, но вы можете удалить любые части, которые вы пожелаете.

Я проверил следующий код, чтобы он был успешным на моем локальном хосте:

$db = JFactory::getDBO();
try {
    $query = $db->getQuery(true)
                ->update($db->quoteName('#__mytable'))
                ->set($db->quoteName("price") . " = " . $db->qn("price") . " - " . (int)$item['total'])
                ->where($db->quoteName("catid") . " = " . (int)$item['category']);
    echo $query->dump();  // see the generated query (but don't show to public)
    $db->setQuery($query);
    $db->execute();
    if ($affrows = $db->getAffectedRows()) {
        JFactory::getApplication()->enqueueMessage("Updated. Affected Rows: $affrows", 'success');
    } else {
        JFactory::getApplication()->enqueueMessage("Logic Error", 'error');
    }
} catch (Exception $e) {
    JFactory::getApplication()->enqueueMessage("Query Syntax Error: " . $e->getMessage(), 'error');  // never show getMessage() to public
}

Здесьявляется страницей StackOverflow, обсуждающей логику вычитания mysql: обновить столбец, вычтя значение

...