📅  最后修改于: 2023-12-03 15:32:34.178000             🧑  作者: Mango
在 Laravel 中,为了更便捷地操作数据库,我们通常使用 Eloquent ORM 或 Query Builder。但有时候,我们也需要使用原始查询,以满足某些复杂的需求。本文将介绍 Laravel 中的原始查询。
在 Laravel 中,我们可以使用 DB
类来执行原始数据库查询。DB
类包含了一系列方法,比如 select
、insert
、update
和 delete
,用于执行不同类型的原始查询。下面是一个简单的示例:
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
类提供了一系列的方法,比如 select
、insert
、update
和 delete
,用于执行不同类型的原始查询。我们可以使用 ?
或命名占位符 :name
来绑定参数,并使用事务来确保操作的原子性。