前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >laravel 学习之路 数据库操作 查询数据

laravel 学习之路 数据库操作 查询数据

作者头像
风清醉
发布2019-12-18 17:37:42
3.1K0
发布2019-12-18 17:37:42
举报

到这一步 test 表已经有数据了,我们可以来玩数据查询了

运行原生 SQL 查询

一旦配置好数据库连接后,便可以使用 DB facade 运行查询。 DB facade 为每种类型的查询提供了方法: selectupdateinsertdeletestatement

运行 Select 查询

你可以使用 DB Facadeselect 方法来运行基础的查询语句我们在上面创建的路由里增加个 index 的路由

dumplaravel 的打印函数可以把它理解为 phpvar_dump 函数的升级版

代码语言:javascript
复制
Route::prefix('db')->group(function () {
    Route::get('insert', 'DbController@insert');
    Route::get('index', 'DbController@index');
});

并在控制器增加一个 index 方法

代码语言:javascript
复制
<?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 对象,可以像下面这样访问结果值

代码语言:javascript
复制
    function index()
    {
        $data = DB::select('select * from test where testId = ?', [1]);
        foreach ($data as $datum) {
            echo $datum->id;
        }
        dump($data);
    }
使用命名绑定

除了使用 ? 表示参数绑定外,你也可以使用命名绑定来执行一个查询

代码语言:javascript
复制
    function index()
    {
        //使用命名绑定
        $binding = DB::select('select * from test where testId = :id', ['id' => 1]);
        dump($binding);
    }

查询构造器

Laravel 的数据库查询构造器为创建和运行数据库查询提供了一个方便的接口。它可用于执行应用程序中大部分数据库操作,且可在所有支持的数据库系统上运行。

Laravel 的查询构造器使用 PDO参数绑定来保护您的应用程序免受 SQL 注入攻击。因此没有必要清理作为绑定传递的字符串

注意:PDO 不支持绑定列名。因此,不能让用户通过输入来指定查询语句所引用的列名,包括 order by 字段等等。 如果必须要允许用户通过选择某些列来进行查询,请始终根据允许列的白名单来校验列名。

从一个数据表中获取所有行

先注册一个 getList 路由

代码语言:javascript
复制
Route::prefix('db')->group(function () {
    Route::get('insert', 'DbController@insert');
    Route::get('index', 'DbController@index');
    Route::get('getList', 'DbController@getList');
});

并且相应的控制器创建 getList 方法

代码语言:javascript
复制
function getList() {
        $data = DB::table('test')->get();
        dump($data);
    }

DB table 选中表 调用 get 方法就可以获取全部的数,来访问一下 http://study.laraveltest.com/db/getList

三角箭头是可以点击收起展开的,按住 command 键点击三角箭头是可以全部展开。

不过实际业务中大多时候都不会取全部数据并且,一般会有限制语句 where() 方法

代码语言:javascript
复制
    function getList()
    {
        $data = DB::table('test')->where('testId', 1)->get();
        dump($data);
    }

第一参数就是字段名,第二个参数就是值 where('testId', 1) 表示查询 testId 等于 1 的数据,那如果想取 testId 不为 1 的数据 就需要传三个参数,第一个参数还是字段名,第二个参数是符号,第三个参数是值 ->where('testId', '<>', 1)

代码语言:javascript
复制
    function getList()
    {
        $data = DB::table('test')->where('testId', '<>',1)->get();
        dump($data);
    }

sql 中还有个 IN 的用法 laravel 中就是 whereIn() 第一个参数还是字段名第二个参数是数组

代码语言:javascript
复制
  function getList()
    {
        $data = DB::table('test')->whereIn('testId', [1, 2, 3])->get();
        dump($data);
    }

那么 NOT IN 就是 whereNotIn()Between 同理,关联表就是 join 了,可以传3个参数关联表就是 join 了可以传3个参数,第一个参数就是要关联的表名可以使用 as 给表定义别名,当表比较长的时候会比较方便,第二个和第三个分别是关联的字段,谁在前谁在后无所谓哈

代码语言:javascript
复制
    function getList() {
        $data = DB::table('test')->join('users as u', 'u.id', 'test.user_id')->get();
        dump($data);
    }

如果使用了 joinwhere 就同样要指明表了

代码语言:javascript
复制
    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 joinright join 使用驼峰命名法即可

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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 还可以指定第二个参数用于指定正序还是倒序

代码语言:javascript
复制
    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

代码语言:javascript
复制
    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 方法 路由就不多叙述了

代码语言:javascript
复制
    function getRow()
    {
        $data = DB::table('test')->where('id', 1)->first();
        echo $data->title;
        dump($data);
    }

请求 http://study.laraveltest.com/db/getRow 会得到 StdClass 对象

如果你甚至不需要整行数据,可以使用 value 方法从记录中获取单个值

代码语言:javascript
复制
    function getRow()
    {
        $data = DB::table('test')->where('id', 1)->value('title');
        dump($data);
    }
获取一列的值

当然业务中有时候需要获取 某个字段 哪一列的值的集合,这个时候就用到了 pluck 方法,pluck 接受 2 个参数

  • 第一个参数是我们要取的字段;
  • 第二个字段是可以选的用来做 key
代码语言:javascript
复制
    function getPluck(){
        $titles = DB::table('test')->pluck('title');
        foreach ($titles as $title) {
            echo $title;echo "<br>";
        }
    }

当然 还可以将 test 表里 title 字段作为键名,describe 字段作为键值 返回

代码语言:javascript
复制
    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, maxminavg,还有 sum 这些就很简单了

代码语言:javascript
复制
$users = DB::table('test')->count();

$price = DB::table('test')->max('id');

当然也可以将这些聚合方法与其他的查询语句相结合

代码语言:javascript
复制
$price = DB::table('test')->where('id', 1)->avg('price');
判断记录是否存在

这个操作除了用 count 方法外 还可以使用 existsdoesntExist 方法

代码语言:javascript
复制
return DB::table('test')->where('id', 1)->exists();

return DB::table('test')->where('id', 1)->doesntExist();
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 运行原生 SQL 查询
    • 运行 Select 查询
      • 使用命名绑定
      • 查询构造器
        • 从一个数据表中获取所有行
          • 从数据表中获取单行或单列
            • 获取一列的值
              • 聚合
                • 判断记录是否存在
                相关产品与服务
                数据库
                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档