Frenlee

在CI(codeigniter)框架中使用laravel的illuminate/database

概述

当你使用过laravel中的ORM(对象关系映射)数据库组件,你就再也无法忍受类似于CI中那种数据库的操作模式.所以被迫在CI中集成了laravel数据库的组件,如果你是多个项目基于相同的数据库开发的,你可以共用这一套数据库操作,简直很方便!

引入代码

使用composer引入illuminate/database 代码

在此之前你是需要有php composer 以及基于ci创建了项目的.关于composer 下载慢的问题,可以移步< composer中文网 >
在这里当然少不了翻页的操作,所以得引入pagination组件

1
2
compose require illuminate/database
compose require illuminate/pagination

加载完后记得将vendor/autoload.php 这个文件加入到你的ci项目的index.php 文件中,或者在config/config.php 文件中的
composer_autoload 配置中配置好你的vendor/autoload.php 的路径

创建Model父类

其他数据表模型的类的创建将继承自这个类,当然这些文件的存放你可以放在你的CI项目中,也可以放在别的地方,你可以通过psr4标准来创建加载,或者自己编写自动加载类和方法来加载都行.我将这个Model类命名为Model,它继承自\Illuminate\Database\Eloquent\Model类,代码如下

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
namespace M;
/**
* 数据模型基础
*/

use Carbon\Carbon;
use Illuminate\Database\DatabaseManager;
use Illuminate\Database\Schema\Builder;
use Illuminate\Events\Dispatcher;
use Illuminate\Container\Container;
use Illuminate\Database\Capsule\Manager;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;

class Model extends \Illuminate\Database\Eloquent\Model
{
/**
* @var Manager
*/
protected $db = null;

// 构造函数 初始化数据库链接的一些参数
public function __construct()
{
$this->init();
Carbon::setLocale('zh');
$this->append('human_create_time', 'human_update_time');
$this->addHidden('human_create_time', 'human_update_time');
}


// 初始化数据库连接
public function init()
{
static $capsule = null;
if (!$capsule) {
$capsule = new Manager();
if($connections = \DatabaseConfig::config()) {
foreach ($connections as $key=> $connection) {
$capsule->addConnection($connection, $key);
}
}
$capsule->getDatabaseManager()->setDefaultConnection('db_user');
$capsule->setEventDispatcher(new Dispatcher(new Container));
$capsule->setAsGlobal();
$capsule->bootEloquent();
}
$this->db = $capsule;
return $capsule;
}

// 设置页数翻页页数
public static function page($page = 1, $url = false)
{
Paginator::currentPathResolver(function ()use($url) {
$scheme = \Util::isHTTPS() ? 'https://' : 'http://';
$url = $url ? : $scheme.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
$urls = explode('?', $url, 2);
if (isset($urls[1])) {
$urls[1] = ltrim(preg_replace('/[&]?page=\d*/', '' ,$urls[1]), '&');
}
return rtrim(implode('?', $urls),'?');
// return 'http://'.$_SERVER['SERVER_NAME'].preg_replace('/[?&]page=\d*/', '' ,$_SERVER['REQUEST_URI']);
});

Paginator::currentPageResolver(function()use($page){
return $page;
});
}

// 使用原生的sql语句 相当于于DB::raw()
public function raw($data)
{
return $this->db->getDatabaseManager()->raw($data);
}

// 数据翻页使用
public static function paginate(LengthAwarePaginator $data, $appends = [])
{
$window = \Illuminate\Pagination\UrlWindow::make($data->appends($appends));
$elements = [
$window['first'],
is_array($window['slider']) ? '...' : null,
$window['slider'],
is_array($window['last']) ? '...' : null,
$window['last'],
];
return $elements;
}

// Tips: 以下三个方法主要是用来格式化一些时间字段,如果不需要可以删除
public function getHumanCreateTimeAttribute()
{
return $this->create_time->diffForHumans();
}

public function getHumanUpdateTimeAttribute()
{
return $this->update_time->diffForHumans();
}

/**
* 人性化时间
* @param LengthAwarePaginator $data
* @param $key
*/
public static function humanTimes($data, $key, \Closure $closure = null)
{
$keys = is_string($key) ? [$key] : $key;

$for = function($keys, $item, $closure){
foreach ($keys as $key) {
Carbon::createFromTimestamp(strtotime($item->$key));
$item->{'human_'.$key} = $item->$key->diffForHumans();
}
$closure && $closure($item);
};

if ($data instanceof LengthAwarePaginator) {
$data->each(function($item)use($keys, $closure, $for){
$for($keys, $item, $closure);
});
} else {
$for($keys, $data, $closure);
}
}
}

数据库配置

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
40
41
42
43
/**
* 数据库配置
*/
class DatabaseConfig
{
const DEFAULT_CONN = '默认数据库链接数组key';
static $testHostName = 'host';
static $testUsername = 'root';
static $testPassword = 'password';

// 获取配置文件
public static function config()
{
$host = static::$hostname;
$username = static::$username;
$password = static::$password;
$con = compact('host', 'username', 'password');

// 可设置多个数据库连接
$connections = [
'db_user' => ['database' => 'db'] + $con,
];
$template = [
'driver' => 'mysql',
'host' => 'localhost',
'port' => '3306',
'database' => '',
'username' => '',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
];

foreach ($connections as &$connection) {
$connection = array_merge($template, $connection);
}

return $connections;
}
}

创建数据模型

如果你的数据库是之前就存在的,和Laravel的数据库设计默认标准有所出入,则需要在创建模型的时候需要设定一些值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace M\User;
use M\Model;

class ConfigItem extends Model
{
// 可填充字段
protected $fillable = [];

// 表名
protected $table = 'config_item';

// 时间戳
public $timestamps = false;

// 链接名称
protected $connection = 'db_user';

// 个数转换
protected $casts = ['value' => 'array'];
}

使用

它的使用请参考laravel中的database 使用

1
2
// 分页数据获取 这个是需要代码写在使用的地方的,不会自动调用
\M\User\ConfigItem::page(array_get($urlParam, 'page', 1));