我有以下代码试图截断一个表。 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()
方法需要一个表名作为其唯一参数的字符串;您提供的是反引号包装的字符串——但该方法已经提供了反引号包装服务。 (即使去掉反引号,您的方法也不会成功。)
setQuery()
和 execute()
调用已经在方法内部,因此您无需创建新的查询对象,也无需手动执行任何操作。
方法中没有 return,因此返回默认的 null
-- 因此,您的 $truncate_query
变为 null
。当您尝试 execute(null)
时,您什么也得不到——甚至连错误消息都没有。
如果您想知道删除了多少行,您需要事先运行一个 SELECT
查询来计算行数。
如果您想确保没有剩余的数据行,您需要调用 SELECT
并检查零行数据。
这里是 my answer (用不同的措辞)关于你的 JSX 问题。
关于mysql - 为什么 truncateTable 在 Joomla 3.7 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51403310/