解决Laravel编写数据库查询语句时的反人类设计

Laravel 本身是一个很好用的框架, 但是每次查询数据库的时候, 都要DB::table(表名), 非常反人类

今天研究了一下, 发现 DB::table(表名) 实际上是返回了一个\Illuminate\Database\Query\Builder, 而这个 builder 是在框架初始化时创建的Illuminate\Database\Connection, 存在 app(‘db’)字段里, 那就好办了, 搞个 Base 类, 调用 db 方法的时候直接返回app('db')->query()->newQuery(), over

截图如下

Base类

实际查询

PS:

  1. 相关代码

基类=>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
/**
* Created by PhpStorm.
* User: yaoze
* Date: 2017/10/22
* Time: 5:00
*/

namespace App\Model;

class Base
{
protected static $Instance;

/**
* @return static
*/
static public function Instance()
{
$class = get_called_class();
if (empty(self::$Instance[$class])) {
self::$Instance[$class] = new $class;
}
return self::$Instance[$class];
}

protected function __construct()
{
}

/**
* @return \Illuminate\Database\Query\Builder
*/
protected function db()
{
return app('db')->query()->newQuery();
}
}

查询代码=>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php
/**
* Created by PhpStorm.
* User: yaoze
* Date: 2017/10/22
* Time: 4:51
*/

namespace App\Model;

use \DB;

/**
* 测试方法
* Class Test
* @package App\Model
*/
class Test extends Base
{
/**
* 初始化地址库
*/
public function initAddressTable()
{
$raw_address_list = $this->db()->select('*')
->from('address')
->limit(10)
->get();
return $raw_address_list;
}
}

  1. 初始化数据库连接的位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

/**
* Register container bindings for the application.
*
* @return void
*/
protected function registerDatabaseBindings()
{
$this->singleton('db', function () {
return $this->loadComponent(
'database', [
'Illuminate\Database\DatabaseServiceProvider',
'Illuminate\Pagination\PaginationServiceProvider',
], 'db'
);
});
}



解决Laravel编写数据库查询语句时的反人类设计
https://www.yaozeyuan.online/2018/03/15/2018/03/解决Laravel编写数据库查询语句时的反人类设计/
作者
姚泽源
发布于
2018年3月15日
许可协议