使用Joomla UpdateObject方法使用同一表中的计算字段更新数据库字段

时间:2019-01-22 22:53:56

标签: model-view-controller joomla joomla3.0 joomla-extensions

恰到好处。

我需要使用该字段来首先计算新值来更新数据库中的一个字段。

例如字段:https://i.stack.imgur.com/FADH6.jpg

现在我正在使用Joomla updateObject函数。我的目标是不使用select语句而从数据库表中获取“已用”值。

然后,我需要用它来计算一个新值(花费+ 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 :(得分:1)

尝试使用updateObject('#__mytable', $object, 'catid');的症结在于,查询逻辑需要在计算中引用列名,以将“差异”分配为新值。原始mysql查询语法,用于用减去另一个值的值更新列值,例如:

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

updateObject()会将spent - {$item['total']}转换为文字字符串,数据库将使用数字值,因此UPDATE会记录一个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减法逻辑:update a column by subtracting a value