使用medoo插件來鏈接和操做數據庫。php
原文連接:http://www.voidking.com/2017/...mysql
一、在composer中添加依賴:git
"catfan/medoo": "*"
二、更新依賴composer update
github
一、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());
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類,繼承它便可。
鑑於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...