2012-03-05 2 views
3

Следующий код прямо из документов и должен вставлять строку в таблицу «test».Joomla 1.5 - JTable запросы всегда делают UPDATE вместо INSERT

$row = &JTable::getInstance('test', 'Table'); 
if (!$row->bind(array('user_id'=>123, 'customer_id'=>1234))) { 
    return JError::raiseWarning(500, $row->getError()); 
} 
if (!$row->store()) { 
    JError::raiseError(500, $row->getError()); 
} 

Мой класс таблица выглядит следующим образом:

class TableTest extends JTable 
{ 
    var $user_id = null; 
    var $customer_id = null; 

    function __construct(&$db) 
    { 
     parent::__construct('#__ipwatch', 'user_id', $db); 
    } 

} 

SELECT запросы работают нормально, но не INSERT из них. Через отладку я обнаружил, что выполняемый запрос: UPDATE jos_test SET customer_id='1234' WHERE user_id='123', что не получается, потому что строка еще не существует в базе данных (должно быть INSERT вместо UPDATE).


При копании через код Joomla Я нахожу это:

function __construct($table, $key, &$db) 
{ 
    $this->_tbl  = $table; 
    $this->_tbl_key = $key; 
    $this->_db  =& $db; 
} 

    ..... 
    ..... 

function store($updateNulls=false) 
{ 
    $k = $this->_tbl_key; 

    if($this->$k) 
    { 
     $ret = $this->_db->updateObject($this->_tbl, $this, $this->_tbl_key, $updateNulls); 
    } 
    else 
    { 
     $ret = $this->_db->insertObject($this->_tbl, $this, $this->_tbl_key); 
    } 
    if(!$ret) 
    { 
     $this->setError(get_class($this).'::store failed - '.$this->_db->getErrorMsg()); 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 

_tbl_key здесь «user_id», который я прошел в моем классе TableTest, так что может показаться, что он всегда будет вызывать UpdateObject() когда этот ключ установлен. Что непонятно.

У кого-нибудь есть понимание?

ответ

3
function store($updateNulls=false) 
{ 
    // You set user_id so this branch is executed 
    if($this->$k) 
    { 
     $ret = $this->_db->updateObject($this->_tbl, $this, $this->_tbl_key, $updateNulls); 
    } 
    // ... 

Глядя на код, мне кажется, что магазин() проверить, если поле первичного ключа присутствует, и если его используют UpdateObject(). Это означает, что если вы хотите сохранить нового пользователя, вы не можете указать user_id.

+1

Ах да, проблема заключалась в том, что я не использую первичный ключ с автоматическим добавлением (поскольку моя таблица ассоциирует существующий идентификатор пользователя с идентификатором клиента), поэтому передача user_id вызвала запрос UPDATE. Поскольку мне нужно указать значение моего первичного ключа, я взломал обходной путь, вызвав непосредственно «insertObject» – bcoughlan

+0

^^^ И это обходное решение сломалось в Joomla 2.5, поэтому я поддался и использовал первичный ключ с таблицей. – bcoughlan

Смежные вопросы