Следующий код прямо из документов и должен вставлять строку в таблицу «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() когда этот ключ установлен. Что непонятно.
У кого-нибудь есть понимание?
Ах да, проблема заключалась в том, что я не использую первичный ключ с автоматическим добавлением (поскольку моя таблица ассоциирует существующий идентификатор пользователя с идентификатором клиента), поэтому передача user_id вызвала запрос UPDATE. Поскольку мне нужно указать значение моего первичного ключа, я взломал обходной путь, вызвав непосредственно «insertObject» – bcoughlan
^^^ И это обходное решение сломалось в Joomla 2.5, поэтому я поддался и использовал первичный ключ с таблицей. – bcoughlan