Laravel 数据库之:数据库请求构建器
简介
Laravel 的数据库查询构造器提供了一个方便、流畅的接口,用来创建及运行数据库查询语句。它能用来执行应用程序中的大部分数据库操作,且能在所有被支持的数据库系统中使用。
Laravel 的查询构造器使用 PDO 参数绑定,来保护你的应用程序免受 SQL 注入的攻击。在绑定传入字符串前不需要清理它们。
获取结果
从数据表中获取所有的数据列
你可以使用 DB
facade 的 table
方法开始查询。这个 table
方法针对查询表返回一个查询构造器实例,允许你在查询时链式调用更多约束,并使用 get
方法获取最终结果:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show a list of all of the application's users.
*
* @return Response
*/
public function index()
{
$users = DB::table('users')->get();
return view('user.index', ['users' => $users]);
}
}
get
方法会返回一个 Illuminate\Support\Collection
结果,其中每个结果都是一个 PHP StdClass
对象的实例。您可以通过访问 列中对象的属性访问每个列的值:
foreach ($users as $user) {
echo $user->name;
}
从数据表中获取单个列或行
如果你只需要从数据表中获取一行数据,则可以使用 first
方法。这个方法将返回单个 StdClass
对象:
$user = DB::table('users')->where('name', 'John')->first();
echo $user->name;
如果你不需要一整行数据,则可以使用 value
方法来从单条记录中取出单个值。此方法将直接返回字段的值:
$email = DB::table('users')->where('name', 'John')->value('email');
获取一列的值
如果你想要获取一个包含单个字段值的集合,可以使用 pluck
方法。在下面的例子中,我们将取出 roles 表中 title 字段的集合:
$titles = DB::table('roles')->pluck('title');
foreach ($titles as $title) {
echo $title;
}
你也可以在返回的数组中指定自定义的键值字段:
$roles = DB::table('roles')->pluck('title', 'name');
foreach ($roles as $name => $title) {
echo $title;
}
结果分块
如果你需要操作数千条数据库记录,可以考虑使用 chunk
方法。这个方法每次只取出一小块结果,并会将每个块传递给一个 闭包
处理。这个方法对于编写数千条记录的 Artisan 命令 是非常有用的。例如,让我们把 users
表进行分块,每次操作 100 条数据:
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
foreach ($users as $user) {
//
}
});
你可以从 闭包
中返回 false
,以停止对后续分块的处理:
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
// Process the records...
return false;
});
聚合
查询构造器也支持各种聚合方法,如 count
、 max
、 min
、 avg
和 sum
。你可以在创建查询后调用其中的任意一个方法:
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
当然,你也可以将这些方法结合其它子句来进行查询:
$price = DB::table('orders')
->where('finalized', 1)
->avg('price');
Selects
指定一个 Select 子句
当然,你并不会总是想从数据表中选出所有的字段。这时可使用 select
方法自定义一个 select
子句来查询指定的字段:
$users = DB::table('users')->select('name', 'email as user_email')->get();
distinct
方法允许你强制让查询返回不重复的结果:
$users = DB::table('users')->distinct()->get();
如果你已有一个查询构造器实例,并且希望在现有的 select 子句中加入一个字段,则可以使用 addSelect
方法:
$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();
原始表达式
有时候你可能需要在查询中使用原始表达式。这些表达式将会被当作字符串注入到查询中,所以要小心避免造成 SQL 注入攻击!要创建一个原始表达式,可以使用 DB::raw
方法:
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
Joins
Inner Join 语法
查询构造器也可以编写 join 语法。若要执行基本的「inner join」,你可以在查询构造器实例上使用 join
方法。传递给 join
方法的第一个参数是你要 join 数据表的名称,而其它参数则指定用来连接的字段约束。当然,如你所见,你可以在单个查找中连接多个数据表:
$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();