我有以下代码试图截断一个表。Joomla文档让我相信这会奏效,但事实并非如此。我错过了什么?
$db = JFactory::getDbo();
truncate_query = $db->getQuery(true);
//$truncate_query = 'TRUNCATE ' . $db->quoteName('#__mytable');
$truncate_query->truncateTable($db->quoteName('#__mytable'));
$db->setQuery($truncate_query);
echo $truncate_query;
exit();
如果我使用注释掉的行手动生成SQL,它确实有效。我仍然希望使用truncateTable函数的原因是,我试图将截断包含在事务中。当我使用手动语句时,即使事务的另一部分失败,表仍然会被截断,这很烦人,因为其他语句依赖于被截断的数据,所以如果表在不应该被清空的时候被清空,那么就没有数据可以再次运行事务了。很烦人!
以下是如何调用/执行截断查询:
JFactory::getDbo()->truncateTable('#__mytable');
现在有更多细节。。。
以下是Joomla源代码中方法的代码块:
public function truncateTable($table) { $this->setQuery('TRUNCATE TABLE ' . $this->quoteName($table)); $this->execute(); }
正如您所看到的,truncateTable()
方法需要一个表名作为其唯一参数的字符串;您提供了一个backtick-wrapped字符串,但是该方法已经提供了backtick-wrapped服务。(即使你去掉了你的支持,你的方法也不会成功。(
setQuery()
和execute()
调用已经在方法内部,因此您不需要创建新的查询对象,也不需要手动执行任何操作。
该方法中没有返回,因此返回默认的null
——因此,您的$truncate_query
变为null
。当你尝试execute(null)
时,你什么也得不到——甚至连一条错误消息都没有。
如果您想知道删除了多少行,则需要在手动计数行之前运行SELECT
查询。
如果要确保没有剩余的数据行,则需要调用SELECT
并检查是否有零行数据。
这是我对你的JSX问题的回答(用不同的措辞(。