跳到主要内容
版本: 5.1

将数据插入数据库

查询

自新 Joomla 框架引入以来,Joomla 的数据库查询发生了变化,"查询链"现在是构建数据库查询的推荐方法(尽管仍然支持字符串查询)。

查询链是指将多个方法依次连接起来的一种方法,每个方法都返回一个支持下一个方法的对象,从而提高可读性和简化代码。

要获取 DatabaseQuery 类的全新实例,我们使用 DatabaseDriver getQuery 方法

use Joomla\CMS\Factory;

// When used in the component's Model
$db = $this->getDatabase();

// When used in other places
$db = Factory::getContainer()->get('DatabaseDriver');

$query = $db->getQuery(true);
开发人员提示

**不要**再使用以下 Joomla 3 方法,因为它已弃用
$db = Factory::getDbo();

DatabaseDriver::getQuery 接受一个可选参数 $new,可以是 true 或 false(默认为 false)。

为了查询我们的数据源,我们可以调用多个 DatabaseQuery 方法;这些方法封装了数据源的查询语言(在大多数情况下为 SQL),将查询特定的语法隐藏在开发人员面前,并提高了开发人员源代码的可移植性。

一些更常用的方法包括:select、from、join、where 和 order。还有一些方法,如 insert、update 和 delete,用于修改数据存储中的记录。通过链接这些方法和其他方法调用,您可以创建几乎所有针对数据存储的查询,而不会影响代码的可移植性。

插入记录

通过查询对象使用 SQL

DatabaseQuery 类提供了许多构建插入查询的方法,最常见的是 insert、columns 和 values。

// Get a db connection.
$db = Factory::getContainer()->get('DatabaseDriver');

// Create a new query object.
$query = $db->getQuery(true);

// Insert columns.
$columns = array('user_id', 'profile_key', 'profile_value', 'ordering');

// Prepare the insert query.
$query
->insert($db->quoteName('#__user_profiles'))
->columns($db->quoteName($columns))
->values(':user_id, :profile_key, :profile_value, :ordering');

// Bind values
$query
->bind(':user_id', 1001, Joomla\Database\ParameterType::INTEGER)
->bind(':profile_key', 'custom.message')
->bind(':profile_value', 'Inserting a record using insert()')
->bind(':ordering', 1, Joomla\Database\ParameterType::INTEGER);

// Set the query using our newly populated query object and execute it.
$db->setQuery($query);

$db->execute();

使用对象

DatabaseDriver 类还提供了一种方便的方法,可以将对象直接保存到数据库中,使我们能够在不编写任何 SQL 代码的情况下将记录添加到表中。

// Create and populate an object.
$profile = new stdClass();
$profile->user_id = 1001;
$profile->profile_key='custom.message';
$profile->profile_value='Inserting a record using insertObject()';
$profile->ordering=1;

// Insert the object into the user profile table.
$result = Factory::getContainer()->get('DatabaseDriver')->insertObject('#__user_profiles', $profile);

请注意,这里我们不需要转义表名;insertObject 方法会为我们处理。

如果在将记录插入数据库表时遇到问题,insertObject 方法将抛出错误。

如果您提供一个唯一的 primary key 值(如上面的示例中),强烈建议您先通过该列值从表中选择,然后再尝试插入。

如果您只是在表中插入下一行(即数据库会生成一个 primary key 值),您可以将 primary key 列名作为 insertObject() 方法的第三个参数指定,该方法会使用新生成的 primary key 值更新对象。

例如,给出以下语句

$result = $dbconnect->insertObject('#__my_table', $object, 'primary_key');

执行后,$object->primary_key 将使用新插入行的 primary key 值进行更新。

开发人员提示

在插入之前,将 $object->primary_key 设置为 null 或 0(零)。