📜  laravel 中的原始查询 - PHP (1)

📅  最后修改于: 2023-12-03 15:32:34.178000             🧑  作者: Mango

Laravel 中的原始查询 - PHP

在 Laravel 中,为了更便捷地操作数据库,我们通常使用 Eloquent ORM 或 Query Builder。但有时候,我们也需要使用原始查询,以满足某些复杂的需求。本文将介绍 Laravel 中的原始查询。

使用原始查询

在 Laravel 中,我们可以使用 DB 类来执行原始数据库查询。DB 类包含了一系列方法,比如 selectinsertupdatedelete,用于执行不同类型的原始查询。下面是一个简单的示例:

use Illuminate\Support\Facades\DB;

$users = DB::select('SELECT * FROM users WHERE active = ?', [1]);

foreach ($users as $user) {
    //
}

在上面的示例中,我们使用 DB::select() 方法执行了一个 SELECT 查询。该方法的第一个参数是 SQL 语句,第二个参数是查询参数。我们可以使用 ? 占位符来代替参数,或者使用命名占位符,如 :name

绑定参数

在执行原始查询时,我们通常需要绑定一些参数。我们可以使用 ? 或命名占位符 :name 来代表这些参数,然后将这些参数作为第二个参数传递给查询方法。

// 使用 ? 占位符
$users = DB::select('SELECT * FROM users WHERE id = ? AND active = ?', [1, 1]);

// 使用命名占位符
$users = DB::select('SELECT * FROM users WHERE id = :id AND active = :active', ['id' => 1, 'active' => 1]);

Laravel 还支持在 SQL 语句中使用 ? 占位符来表示数组参数:

$ids = [1, 2, 3];

$users = DB::select('SELECT * FROM users WHERE id IN (?)', [$ids]);

在上面的示例中,参数 $ids 是一个数组,我们可以将其传递给 DB::select() 方法的第二个参数。但是,当我们使用 IN 运算符时,需要传递的参数是多个值,而不是一个数组,这时我们可以在 SQL 语句中使用 ? 占位符,并将参数放在一个数组中。

获取结果

在执行原始查询之后,我们可以使用以下方法来获取查询结果:

  • select():用于执行 SELECT 查询,并返回查询结果数组。
  • insert():用于执行 INSERT 查询,并返回插入的 ID。
  • update():用于执行 UPDATE 查询,并返回更新的行数。
  • delete():用于执行 DELETE 查询,并返回删除的行数。

除了以上方法之外,还有一些其他的方法可以使用,比如 statement()affectingStatement()getPdo() 等。

// SELECT 查询
$users = DB::select('SELECT * FROM users WHERE active = ?', [1]);

// INSERT 查询
$id = DB::insert('INSERT INTO users (name, email) VALUES (?, ?)', ['John Doe', 'johndoe@example.com']);

// UPDATE 查询
$affected = DB::update('UPDATE users SET active = ? WHERE id = ?', [1, 1]);

// DELETE 查询
$deleted = DB::delete('DELETE FROM users WHERE id = ?', [1]);
使用事务

同样地,在执行原始查询时,我们也可以使用事务来确保操作的原子性。使用事务很简单,只需要调用 DB::transaction() 方法,并在方法体内执行一系列数据库操作。

DB::transaction(function () {
    DB::table('users')->update(['active' => 0]);
    DB::table('posts')->delete();
});

在上面的示例中,我们使用了 DB::transaction() 方法来确保操作是原子性的。如果其中任何一个操作失败,则整个事务会被回滚。

总结

在 Laravel 中,我们可以使用 DB 类来执行原始数据库查询。DB 类提供了一系列的方法,比如 selectinsertupdatedelete,用于执行不同类型的原始查询。我们可以使用 ? 或命名占位符 :name 来绑定参数,并使用事务来确保操作的原子性。