zoukankan      html  css  js  c++  java
  • Laravel 数据库实例教程 —— 使用DB门面操作数据库

    Laravel支持多种数据库,包括MySQL、Postgres、SQLite和SQL Server,在Laravel中连接数据库和查询数据库都非常简单,我们可以使用多种方式与数据库进行交互,包括原生SQL语句、查询构建器以及Eloquent ORM。本节我们先演示如何使用原生SQL在Laravel应用中对数据库进行增删改查。

    百牛信息技术bainiu.ltd整理发布于博客园

    1、连接数据库

    Laravel中数据库配置文件为config/database.php,打开该文件,默认内容如下:

    <?php
    
    return [
        //默认返回结果集为PHP对象实例
        'fetch' => PDO::FETCH_CLASS,
        //默认数据库连接为mysql,可以在.env文件中修改DB_CONNECTION的值
        'default' => env('DB_CONNECTION', 'mysql'),
    
        'connections' => [
            //sqlite数据库相关配置
            'sqlite' => [
                'driver' => 'sqlite',
                'database' => storage_path('database.sqlite'),
                'prefix' => '',
            ],
            //mysql数据库相关配置
            'mysql' => [
                'driver' => 'mysql',
                'host' => env('DB_HOST', 'localhost'),
                'database' => env('DB_DATABASE', 'forge'),
                'username' => env('DB_USERNAME', 'forge'),
                'password' => env('DB_PASSWORD', ''),
                'charset' => 'utf8',
                'collation' => 'utf8_unicode_ci',
                'prefix' => '',
                'strict' => false,
            ],
            //Postgres数据库相关配置
            'pgsql' => [
                'driver' => 'pgsql',
                'host' => env('DB_HOST', 'localhost'),
                'database' => env('DB_DATABASE', 'forge'),
                'username' => env('DB_USERNAME', 'forge'),
                'password' => env('DB_PASSWORD', ''),
                'charset' => 'utf8',
                'prefix' => '',
                'schema' => 'public',
            ],
            //SQL Server数据库相关配置
            'sqlsrv' => [
                'driver' => 'sqlsrv',
                'host' => env('DB_HOST', 'localhost'),
                'database' => env('DB_DATABASE', 'forge'),
                'username' => env('DB_USERNAME', 'forge'),
                'password' => env('DB_PASSWORD', ''),
                'charset' => 'utf8',
                'prefix' => '',
            ],
    
        ],
        //迁移表名称
        'migrations' => 'migrations',
        //Redis数据库相关配置
        'redis' => [
    
            'cluster' => false,
    
            'default' => [
                'host' => '127.0.0.1',
                'port' => 6379,
                'database' => 0,
            ],
     
        ],
    
    ];
    

    如果要修改数据库配置信息,去修改.env对应值即可。我们实例教程使用的Homestead开发环境默认配置,不做修改。如果你没有使用Homestead,则需要根据本地配置修改相应配置值。

    我们在讲Windows上安装Homestead的时候,已经演示过数据库连接测试,以及如何在本地使用Navicat连接Homestead的数据库,这里不再赘述,下面直接进入如何使用数据库进行增删改查。

    2、数据库初始化

    我们在项目根目录使用Artisan命令运行Laravel自带的迁移生成users表和password_reset表:

    php artisan migrate

    对应在数据库中生成三张表:

    运行迁移生成users表

    3、使用DB门面进行增删改查

    3.1 插入数据

    我们使用DB门面执行原生SQL语句,插入操作使用DB门面的insert方法,代码如下:

    <?php
    
    namespace AppHttpControllers;
    
    use IlluminateHttpRequest;
    
    use AppHttpRequests;
    use AppHttpControllersController;
    
    use DB;
    
    class TestController extends Controller
    {
    
    /**
    * Display a listing of the resource.
    *
    * @return Response
    */
    public function index()
    {
    
        DB::insert('insert into users (id, name, email, password) values (?, ?, ? , ? )',
            [1, 'Laravel','laravel@test.com','123']);
        DB::insert('insert into users (id, name, email, password) values (?, ?, ?, ? )',
            [2, 'Academy','academy@test.com','123']);
    
        }
    }
    

    在浏览器中输入http://laravel.app:8000/test,执行成功后在数据库中插入两条记录:

    db-insert-data

    3.2 查询语句

    查询操作使用DB门面的select方法,代码如下:

    $user = DB::select('select * from users where id = ?', [1]);
    dd($user);
    

    在浏览器地址栏输入http://laravel.app:8000/test,输出内容如下:

    db-select-data

    可以看到select查询返回的结果是数组。而数组中的每一个元素都是PHP对象。

    我们还 可以看到在执行查询的时候使用了参数绑定,以避免SQL注入。除此之外还可以使用命名绑定:

    $user = DB::select('select * from users where id = :id', [':id'=>1]);
    

    效果一样。

    3.3 更新语句

    更新表记录可以使用DB门面的update方法,该方法返回受影响的行数:

    $affected = DB::update('update users set name="LaravelAcademy" where name = ?', ['Academy']);
    echo $affected;
    

    打印结果为1,如果没有更新任何记录则返回0。

    3.4 删除语句

    删除表记录使用DB门面的delete方法,和update类似,该方法返回被删除的行数:

    $deleted = DB::delete('delete from users');
    echo $deleted;
    

    打印结果为2,表数据都被我们删除了。

    3.5 通用语句

    除了上述这些DML(insert/update/delete)和DQL(select)语句,SQL语句还包括DCL(create/drop等)和DDL(grant等),要运行后者,我们可以调用DB门面的statement方法:

    DB::statement('drop table users');
    

    执行完该语句后,数据表users会被删除。

    4、监听查询事件

    除此之外,我们还可以通过DB门面的listen方法监听查询事件,比如我们在记录日志和调试的时候这会给我们确定问题提供便利,可以在服务提供者的boot方法中注册该监听器,例如我们在AppServiceProviderboot方法中定义监听器如下:

    /**
    * 启动所有应用服务
    *
    * @return void
    */
    public function boot()
    {
        DB::listen(function($sql, $bindings, $time) {
            echo 'SQL语句执行:'.$sql.',参数:'.json_encode($bindings).',耗时:'.$time.'ms';
        });
    }
    

    这样我们运行如下SQL语句:

    DB::insert('insert into users (id, name, email, password) values (?, ?, ? , ? )',
        [3, 'LaravelAcademy','laravel-academy@test.com','123']);
    

    则浏览器会输出如下内容:

    SQL语句执行:insert into users (id, name, email, password) values (?, ?, ? , ? ),参数:[3,"LaravelAcademy","laravel-academy@test.com","123"],耗时:1.26ms

    5、数据库事务

    很多时候,我们需要执行一连串操作,而其中任何一个操作出错则整个流程失败,需要回退重来,这个时候我们就要用到数据库事务。

    DB门面提供两种方式支持数据库事务,一种是调用transaction方法然后传入闭包作为参数,我们将需要进行事务操作的逻辑放到闭包函数内:

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

    另一种是 beginTransaction、 rollBack和 commit三个方法一起使用从而构建一个完整的事务操作:

    DB::beginTransaction();
    if($somethingIsFailed){
        DB::rollback();
        return false;
    }
    DB::commit();
    

    此外,使用DB门面提供的事务还支持查询构建器和Eloquent ORM数据库操作。

  • 相关阅读:
    BZOJ5302: [Haoi2018]奇怪的背包
    BZOJ5303: [Haoi2018]反色游戏
    UOJ#217. 【UNR #1】奇怪的线段树(广义线段树性质+上下界最小流)
    Codeforces 702F T-Shirts(平衡树+复杂度分析)
    满足决策单调性的 DP 的通用做法
    JZOJ 6754. 2020.07.18【NOI2020】模拟T3 (树链剖分+分治+闵科夫斯基和)
    JZOJ 6756. 2020.07.21【NOI2020】模拟T2 (搜索有用状态+背包dp)
    JZOJ 6757 2020.07.21【NOI2020】模拟T3 (至少容斥+OGF+NTT)
    线性规划转对偶问题
    GDOI 2020 赛前反思
  • 原文地址:https://www.cnblogs.com/bainiu/p/7550545.html
Copyright © 2011-2022 走看看