从零开始打造自己的PHP框架——第5章

文章目录
  1. 1. 目标
  2. 2. medoo基础
    1. 2.1. 安装medoo
    2. 2.2. 使用medoo
    3. 2.3. 增删查改
      1. 2.3.1. 查找
    4. 2.4. 插入
    5. 2.5. 删除
    6. 2.6. 修改
  3. 3. medoo进阶
    1. 3.1. 回顾
    2. 3.2. model.php
  4. 4. 小结
  5. 5. 源码分享
  6. 6. 书签

目标

使用medoo插件来连接和操作数据库。

medoo基础

安装medoo

1、在composer中添加依赖:

1
"catfan/medoo": "*"

2、更新依赖
composer update

使用medoo

1、config目录添加medoo_config.php为:

1
2
3
4
5
6
7
8
9
10
11
12
<?php

return array(
'database_type' => 'mysql',
'database_name' => 'vkphp',
'server' => 'localhost',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'port' => 3306,// 可选参数
'prefix' => 'vk_',// 可选,定义表的前缀
);

2、core目录添加medoo.php为:

1
2
3
4
5
6
7
8
9
<?php
namespace core;

class medoo extends \Medoo\Medoo{
public function __construct(){
$conf = \core\conf::all('medoo_config');
parent::__construct($conf);
}
}

3、app/ctrl/indexCtrl.php中添加函数:

1
2
3
4
public function medoo(){
$medoo = new \core\medoo();
dump($medoo);
}

访问 http://vkphp.dev/index/medoo ,即可看到medoo的相关信息。

增删查改

查找

1
2
$ret = $medoo->select('user','*',['username'=>'voidking']);
dump($ret);

插入

1
2
3
4
5
6
$data = array(
'username'=>'voidking1',
'password'=>'voidking1'
);
$ret = $medoo->insert('user',$data);
dump($ret);

因为medoo的版本问题(1.4.5),此时并没有打印出这条记录的id,而是PDOStatement object。此时,要想获取记录id,有两个方案:

方案一:从medoo中获取

1
dump($medoo->id());

方案二:找到vender/catfan/medoo/src/Medoo.php的第1173行,修改为

1
2
$this->exec('INSERT INTO ' . $this->tableQuote($table) . ' (' . implode(', ', $fields) . ') VALUES ' . implode(', ', $stack), $map);
return $this->pdo->lastInsertId();

删除

1
2
$ret = $medoo->delete('user',['username'=>'voidking2']);
dump($ret->rowCount()); // 受影响的行数

修改

1
2
$ret = $medoo->update('user',['username'=>'voidking2'],['username'=>'voidking1']);
dump($ret->rowCount());

medoo进阶

回顾

yii框架,对于每个表,我们都要创建一个model类,继承ActiveRecord类。比如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
namespace app\models;
use yii\db\ActiveRecord;

// Project.php
class Project extends ActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}

public function getTenProject(){
// 具体实现
}
}

在使用的时候,新建一个model对象,调用其中的方法即可:

1
$project = new Project();

thinkphp框架,对于每个表,我们不用创建model类。在使用的时候,直接新建一个默认model对象,传入表名,调用其中的方法即可:

1
$project = M('project');

当然,thinkphp也可以自定义model类,继承Model类。比如:

1
2
3
4
5
6
7
<?php
// ProjectModel.class.php
class ProjectModel extends Model{
public function getTenProject(){
// 具体实现
}
}

使用D方法新建自定义model对象,找不到定义类的情况下会调用M方法:

1
$project = D('project');

yii和thinkphp的两种实现方案,异曲同工,同样都包含了默认model类和自定义model类。
yii中,默认model类为ActiveRecord,如果要自定义model类,继承它即可。
thinkphp中,默认model类为Model,如果要自定义model类,继承它即可。

model.php

鉴于yii的实现方式,我们也来新建一个model基类,其他的model类都继承它。

1、core目录下,新建model.php,内容如下:

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
<?php
namespace core;

class model extends \core\medoo{
public $table_name = '';
public function __construct($table_name){
$name_arr = explode('\\',$table_name);
$this->table_name = strtolower(end($name_arr));
parent::__construct();
//dump($this->table_name);
}

public function list_all(){
$ret = $this->select($this->table_name,'*');
return $ret;
}

public function find_by_id($id){
$ret = $this->select($this->table_name,'*',['id'=>$id]);
return $ret;
}

public function find_by_condition($condition){
$ret = $this->select($this->table_name,'*',$condition);
return $ret;
}

public function add($data){
$ret = $this->insert($this->table_name,$data);
return $this->id();
}

public function del($condition){
$ret = $this->delete($this->table_name,$condition);
return $ret->rowCount(); // 受影响的行数
}

public function edit($data,$condition){
$ret = $this->update($this->table_name,$data,$condition);
return $ret->rowCount();
}

}

2、在app/model目录中新建user.php,内容如下:

1
2
3
4
5
6
7
<?php
namespace app\model;
class user extends \core\model{
public function __construct(){
parent::__construct(__CLASS__);
}
}

3、在app/ctrl/indexCtrl.php中添加函数:

1
2
3
4
5
6
7
$user = new \app\model\user();
dump($user->list_all());
dump($user->find_by_id(1));
dump($user->find_by_condition(['username'=>'voidking']));
dump($user->add(['username'=>'voidking1','password'=>'voidking1']));
dump($user->edit(['username'=>'voidking2'],['username'=>'voidking1']));
dump($user->del(['username'=>'voidking2']));

访问 http://vkphp.dev/index/model ,可以看到操作结果:

操作完成后,也许会感觉数据库表比较乱。这时可以清空表,并且重新从1开始自增id。
truncate vk_user;

小结

至此,整个框架已经基本完成。接下来,我们会开发一个迷你项目,在开发的过程中,测试并改进我们的框架。

源码分享

https://github.com/voidking/vkphp/releases/tag/v1.5.0

书签

从零开始打造自己的PHP框架

Medoo官方文档

Medoo中文文档