從零開始打造本身的PHP框架——第5章

目標

使用medoo插件來鏈接和操做數據庫。php

原文連接:http://www.voidking.com/2017/...mysql

medoo基礎

安裝medoo

一、在composer中添加依賴:git

"catfan/medoo": "*"

二、更新依賴
composer updategithub

使用medoo

一、config目錄添加medoo_config.php爲:sql

<?php

return array(
    'database_type' => 'mysql',
    'database_name' => 'vkphp',
    'server' => 'localhost',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
    'port' => 3306,// 可選參數
    'prefix' => 'vk_',// 可選,定義表的前綴
);

二、core目錄添加medoo.php爲:thinkphp

<?php
namespace core;

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

三、app/ctrl/indexCtrl.php中添加函數:數據庫

public function medoo(){
    $medoo = new \core\medoo();
    dump($medoo);
}

訪問 http://vkphp.dev/index/medoo ,便可看到medoo的相關信息。
api

增刪查改

查找

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

插入

$data = array(
    'username'=>'voidking1',
    'password'=>'voidking1'
);
$ret = $medoo->insert('user',$data);
dump($ret);

由於medoo的版本問題(1.4.5),此時並無打印出這條記錄的id,而是PDOStatement object。此時,要想獲取記錄id,有兩個方案:php框架

方案一:從medoo中獲取app

dump($medoo->id());

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

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

刪除

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

修改

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

medoo進階

回顧

yii框架,對於每一個表,咱們都要建立一個model類,繼承ActiveRecord類。好比:

<?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對象,調用其中的方法便可:

$project = new Project();

thinkphp框架,對於每一個表,咱們不用建立model類。在使用的時候,直接新建一個默認model對象,傳入表名,調用其中的方法便可:

$project = M('project');

固然,thinkphp也能夠自定義model類,繼承Model類。好比:

<?php
// ProjectModel.class.php
class ProjectModel extends Model{
    public function getTenProject(){
        // 具體實現
    }
}

使用D方法新建自定義model對象,找不到定義類的狀況下會調用M方法:

$project = D('project');

yii和thinkphp的兩種實現方案,殊途同歸,一樣都包含了默認model類和自定義model類。
yii中,默認model類爲ActiveRecord,若是要自定義model類,繼承它便可。
thinkphp中,默認model類爲Model,若是要自定義model類,繼承它便可。

model.php

鑑於yii的實現方式,咱們也來新建一個model基類,其餘的model類都繼承它。

一、core目錄下,新建model.php,內容以下:

<?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();
    }

}

二、在app/model目錄中新建user.php,內容以下:

<?php
namespace app\model;
class user extends \core\model{
    public function __construct(){
        parent::__construct(__CLASS__);
    }
}

三、在app/ctrl/indexCtrl.php中添加函數:

$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/v...

書籤

從零開始打造本身的PHP框架

Medoo官方文檔

Medoo中文文檔

相關文章
相關標籤/搜索