到这一步 test 表已经有数据了,我们可以来玩数据查询了
一旦配置好数据库连接后,便可以使用 DB facade
运行查询。 DB facade
为每种类型的查询提供了方法: select
,update
,insert
,delete
和 statement
。
你可以使用 DB Facade
的 select
方法来运行基础的查询语句我们在上面创建的路由里增加个 index
的路由
dump
是laravel
的打印函数可以把它理解为php
的var_dump
函数的升级版
Route::prefix('db')->group(function () {
Route::get('insert', 'DbController@insert');
Route::get('index', 'DbController@index');
});
并在控制器增加一个 index
方法
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class DbController extends Controller
{
//
function insert()
{
// DB::insert('INSERT INTO test (testID,title,email,`describe`) VALUES (1,"这是个title","123456@qq.com","这是个describe")');
$insertData = [
[
"testID" => '2',
"title" => '这是个title2',
"email" => '22222@qq.com',
"describe" => '这是个describe2',
],
[
"testID" => '3',
"title" => '这是个title3',
"email" => '33333@qq.com',
"describe" => '这是个describe3',
],
];
DB::table('test')->insert($insertData);
}
function index()
{
$data = DB::select('select * from test where testId = ?', [1]);
dump($data);
}
}
来访问一下 http://study.laraveltest.com/db/index
传递给 select
方法的第一个参数就是一个原生的 SQL 查询
,而第二个参数则是需要绑定到查询中的参数值。通常,这些值用于约束 where
语句。参数绑定用于防止 SQL 注入
。
select
方法将始终返回一个数组,数组中的每个结果都是一个 StdClass
对象,可以像下面这样访问结果值
function index()
{
$data = DB::select('select * from test where testId = ?', [1]);
foreach ($data as $datum) {
echo $datum->id;
}
dump($data);
}
除了使用 ?
表示参数绑定外,你也可以使用命名绑定来执行一个查询
function index()
{
//使用命名绑定
$binding = DB::select('select * from test where testId = :id', ['id' => 1]);
dump($binding);
}
Laravel
的数据库查询构造器为创建和运行数据库查询提供了一个方便的接口。它可用于执行应用程序中大部分数据库操作,且可在所有支持的数据库系统上运行。
Laravel
的查询构造器使用 PDO
参数绑定来保护您的应用程序免受 SQL 注入攻击。因此没有必要清理作为绑定传递的字符串
注意:
PDO
不支持绑定列名。因此,不能让用户通过输入来指定查询语句所引用的列名,包括order by
字段等等。 如果必须要允许用户通过选择某些列来进行查询,请始终根据允许列的白名单来校验列名。
先注册一个 getList
路由
Route::prefix('db')->group(function () {
Route::get('insert', 'DbController@insert');
Route::get('index', 'DbController@index');
Route::get('getList', 'DbController@getList');
});
并且相应的控制器创建 getList
方法
function getList() {
$data = DB::table('test')->get();
dump($data);
}
DB table
选中表 调用 get
方法就可以获取全部的数,来访问一下 http://study.laraveltest.com/db/getList
三角箭头是可以点击收起展开的,按住 command
键点击三角箭头是可以全部展开。
不过实际业务中大多时候都不会取全部数据并且,一般会有限制语句 where()
方法
function getList()
{
$data = DB::table('test')->where('testId', 1)->get();
dump($data);
}
第一参数就是字段名,第二个参数就是值 where('testId', 1)
表示查询 testId
等于 1 的数据,那如果想取 testId
不为 1 的数据 就需要传三个参数,第一个参数还是字段名,第二个参数是符号,第三个参数是值
->where('testId', '<>', 1)
。
function getList()
{
$data = DB::table('test')->where('testId', '<>',1)->get();
dump($data);
}
sql
中还有个 IN
的用法 laravel
中就是 whereIn()
第一个参数还是字段名第二个参数是数组
function getList()
{
$data = DB::table('test')->whereIn('testId', [1, 2, 3])->get();
dump($data);
}
那么 NOT IN
就是 whereNotIn()
,Between
同理,关联表就是 join
了,可以传3个参数关联表就是 join
了可以传3个参数,第一个参数就是要关联的表名可以使用 as
给表定义别名,当表比较长的时候会比较方便,第二个和第三个分别是关联的字段,谁在前谁在后无所谓哈
function getList() {
$data = DB::table('test')->join('users as u', 'u.id', 'test.user_id')->get();
dump($data);
}
如果使用了 join
那 where
就同样要指明表了
function getList()
{
$data = DB::table('test')
->join('users as u', 'u.id', 'test.testId')
->whereIn('u.id', [1, 2, 3])
->get();
dump($data);
}
联系到 sql
还会有 left join
和 right join
使用驼峰命名法即可
function getList()
{
$data = DB::table('test')
->join('users as u', 'u.id', 'test.testId')
->leftJoin('password_resets as pr', 'pr.email', 'test.email')
->whereIn('u.id', [1, 2, 3])
->get();
dump($data);
}
分组和排序的则需要在关键字后面加个 by
function getList()
{
$data = DB::table('test')
->join('users as u', 'u.id', 'test.testId')
->leftJoin('password_resets as pr', 'pr.email', 'test.email')
->whereIn('u.id', [1, 2, 3])
->groupBy('u.id')
->get();
dump($data);
}
orderBy
还可以指定第二个参数用于指定正序还是倒序
function getList()
{
$data = DB::table('test')
->join('users as u', 'u.id', 'test.testId')
->leftJoin('password_resets as pr', 'pr.email', 'test.email')
->whereIn('u.id', [1, 2, 3])
->groupBy('u.id')
->orderBy('test.created_at', 'desc')
->get();
dump($data);
}
如果只想取指定字段的可以使用 select
function getList()
{
$data = DB::table('test')
->select('u.id', 'u.title', 'u.email')
->join('users as u', 'u.id', 'test.testId')
->leftJoin('password_resets as pr', 'pr.email', 'test.email')
->whereIn('u.id', [1, 2, 3])
->groupBy('u.id')
->orderBy('test.created_at', 'desc')
->get();
dump($data);
}
如果你只需要从数据表中获取一行数据,你可以使用 first
方法。该方法返回一个 StdClass
对象,创建个 getRow
方法 路由就不多叙述了
function getRow()
{
$data = DB::table('test')->where('id', 1)->first();
echo $data->title;
dump($data);
}
请求 http://study.laraveltest.com/db/getRow
会得到 StdClass
对象
如果你甚至不需要整行数据,可以使用 value
方法从记录中获取单个值
function getRow()
{
$data = DB::table('test')->where('id', 1)->value('title');
dump($data);
}
当然业务中有时候需要获取 某个字段 哪一列的值的集合,这个时候就用到了 pluck
方法,pluck
接受 2 个参数
function getPluck(){
$titles = DB::table('test')->pluck('title');
foreach ($titles as $title) {
echo $title;echo "<br>";
}
}
当然 还可以将 test
表里 title
字段作为键名,describe
字段作为键值 返回
function getPluck(){
$titles = DB::table('test')->pluck('describe','title');
foreach ($titles as $title => $describe) {
echo $title;echo "<br>";
echo $describe;echo "<br>";echo "===================";echo "<br>";
}
dump($titles);
}
查询构造器还提供了各种聚合方法,比如 count
, max
,min
, avg
,还有 sum
这些就很简单了
$users = DB::table('test')->count();
$price = DB::table('test')->max('id');
当然也可以将这些聚合方法与其他的查询语句相结合
$price = DB::table('test')->where('id', 1)->avg('price');
这个操作除了用 count
方法外 还可以使用 exists
和 doesntExist
方法
return DB::table('test')->where('id', 1)->exists();
return DB::table('test')->where('id', 1)->doesntExist();