在重复键更新时使用JFactory :: getDbo() - > insertObject

时间:2014-09-17 08:38:08

标签: joomla on-duplicate-key

使用方法:

JFactory::getDbo()->insertObject('#__card_bonus', $object);

重复密钥更新?

3 个答案:

答案 0 :(得分:2)

<?php

$jarticle                   = new stdClass();
$jarticle->id               = 1544;
$jarticle->title            = 'New article';
$jarticle->alias            = JFilterOutput::stringURLSafe($jarticle->title);
$jarticle->introtext        = '<p>re</p>';
$jarticle->state            = 1;
$jarticle->catid            = 13;
$jarticle->created_by       = 111;
$jarticle->access           = 1;
$jarticle->language         = '*';

$db = JFactory::getDbo();
try {
    $query = $db->getQuery(true);
    $result = JFactory::getDbo()->insertObject('#__content', $jarticle);
}
catch (Exception $e){
    $result = JFactory::getDbo()->updateObject('#__content', $jarticle, 'id');
}

我使用这种方法 - 并不完全满意,但是......

或非对象方法:

    $query = $db->getQuery(true);
    $columns = array('username', 'password');
    $values = array($db->quote($username), $db->quote($password));
    $query
        ->insert($db->quoteName('#__db_name'))
        ->columns($db->quoteName($columns))
        ->values(implode(',', $values));
    $query .= ' ON DUPLICATE KEY UPDATE ' . $db->quoteName('password') . ' = ' . $db->quote($password);
    $db->setQuery($query);

答案 1 :(得分:2)

您有几个选择:

1)检查实体ID。这是我的首选选项,因为它只使用单个查询,可以重用任何对象,并且与数据库无关 - 这意味着它可以在您选择的任何DBMS上运行,而其他两个选项是MySQL独有的。

if (isset($object->id)) {
  $db->updateObject('#__card_bonus', $object);
}
else {
  $db->insertObject('#__card_bonus', $object, 'id');
}

我经常使用save(stdClass $object)方法创建一个抽象模型来执行此检查,因此我不必复制它。

2)使用MySQL ON DUPLICATE KEY UPDATE语法编写自己的查询,这是SQL标准的专有扩展,您已经证明了这一点。

3)使用MySQL专有的REPLACE INTO扩展名编写您自己的查询。

答案 2 :(得分:1)

JFactory :: getDbo() - &gt; insertObject(&#39; #__ card_bonus&#39;,$ object, $ keyName );

主键的名称。如果提供,则更新对象属性。 Joomla doc ...