首页 > php教程 > php手册 > 正文

一个简易的ORM类

php中文网
发布: 2016-12-01 00:00:21
原创
1583人浏览过

自己写的一个简易的ORM类,给感兴趣的朋友提供一点思路。
自己写的一个简易的ORM类,给感兴趣的朋友提供一点思路。借鉴了一点TP的思路。<?php <br /> /**<br>  * author: NickBai<br>  * createTime: 2016/11/28 0028 下午 4:00<br>  */<br> class MyOrm implements ArrayAccess<br> {<br>     public $host = '127.0.0.1';  //数据库地址<br>     public $dbname = 'test';   //数据库名<br>     public $user = 'root';  //数据库用户名<br>     public $pwd = 'root';   //数据库密码<br>     public $port = '3306';  //数据库端口<br>     public $charset = 'utf8';   //数据库编码<br>     private $conn = null;    //数据库链接资源<br>     private $alias = [];  //记录全局的语句参数<br>     private $sql;    //存储最后一条sql<br><br>     public function __construct()<br>     {<br>         if( is_null( $this-&gt;conn ) ){<br><br>             $dsn = "mysql:host=$this-&gt;host;dbname=$this-&gt;dbname;charset=$this-&gt;charset;port=$this-&gt;port";<br>             $this-&gt;conn = new PDO( $dsn, $this-&gt;user, $this-&gt;pwd );<br>         }<br>     }<br><br>     //field语句<br>     public function field( $field )<br>     {<br>         if( !is_string( $field ) ){<br>             throw new exception("field语句的参数必须为字符串");<br>         }<br><br>         $this-&gt;alias['field'] = $field;<br>         return $this;<br>     }<br><br>     //table语句<br>     public function table( $table )<br>     {<br>         if( !is_string( $table ) ){<br>             throw new exception("table语句的参数必须为字符串");<br>         }<br><br>         $this-&gt;alias['table'] = $table;<br>         return $this;<br>     }<br><br>     //where语句<br>     public function where( $where )<br>     {<br>         $this-&gt;alias['where'] = '';<br>         if( is_array( $where ) ){<br><br>             foreach( $where as $key=&gt;$vo ){<br>                 $this-&gt;alias['where'] .= " `$key`" . ' = ' . $vo . ' and ';<br>             }<br>             $this-&gt;alias['where'] = rtrim( $this-&gt;alias['where'], 'and ' );<br><br>         }else if( is_string( $where ) ){<br><br>             $this-&gt;alias['where'] = $where;<br>         }else{<br><br>             throw new exception("where语句的参数必须为数组或字符串");<br>         }<br><br>         return $this;<br>     }<br><br>     //limit语句<br>     public function limit( $limit )<br>     {<br>         $this-&gt;alias['limit'] = '';<br>         if( is_numeric( $limit ) ){<br>            $this-&gt;alias['limit'] = '0,' . $limit;<br>         }else if( is_string( $limit ) ){<br>             $this-&gt;alias['limit'] = $limit;<br>         }else{<br>             throw new exception("limit语句的参数必须为数字或字符串");<br>         }<br><br>         return $this;<br>     }<br><br>     //order语句<br>     public function order( $order )<br>     {<br>         if( !is_string( $order ) ){<br>             throw new exception("order语句的参数必须为字符串");<br>         }<br><br>         $this-&gt;alias['order'] = $order;<br>         return $this;<br>     }<br><br>     //group语句<br>     public function group( $group )<br>     {<br>         if( !is_string( $group ) ){<br>             throw new exception("group语句的参数必须为字符串");<br>         }<br><br>         $this-&gt;alias['group'] = $group;<br>         return $this;<br>     }<br><br>     //解析查询sql语句<br>     public function ParseSelectSql()<br>     {<br>         $this-&gt;sql = 'select *';<br>         if( !empty( $this-&gt;alias['field'] ) ){<br>             $this-&gt;sql = str_replace( '*', $this-&gt;alias['field'], $this-&gt;sql );<br>         }<br><br>         if( empty( $this-&gt;alias['table'] ) ){<br>             throw new exception("请用table子句设置查询表");<br>         }else{<br><br>             $this-&gt;sql .= ' from ' . $this-&gt;alias['table'];<br>         }<br><br>         if( !empty( $this-&gt;alias['where'] ) ){<br>             $this-&gt;sql .= ' where ' . $this-&gt;alias['where'];<br>         }<br><br>         if( !empty( $this-&gt;alias['group'] ) ){<br>             $this-&gt;sql .= ' group by ' . $this-&gt;alias['group'];<br>         }<br><br>         if( !empty( $this-&gt;alias['order'] ) ){<br>             $this-&gt;sql .= ' order by ' . $this-&gt;alias['order'];<br>         }<br><br>         if( !empty( $this-&gt;alias['limit'] ) ){<br>             $this-&gt;sql .= ' limit ' . $this-&gt;alias['limit'];<br>         }<br><br>     }<br><br>     //解析添加sql语句<br>     public function ParseAddSql()<br>     {<br>         $this-&gt;sql = 'insert into ';<br>         if( empty( $this-&gt;alias['table'] ) ){<br>             throw new exception("请用table子句设置添加表");<br>         }else{<br><br>             $this-&gt;sql .= $this-&gt;alias['table'] . ' set ';<br>         }<br><br>         return $this-&gt;sql;<br>     }<br><br>     //解析更新sql语句<br>     public function ParseUpdateSql()<br>     {<br>         $this-&gt;sql = 'update ';<br>         if( empty( $this-&gt;alias['table'] ) ){<br>             throw new exception("请用table子句设置修改表");<br>         }else{<br><br>             $this-&gt;sql .= $this-&gt;alias['table'] . ' set ';<br>         }<br><br>         if( empty( $this-&gt;alias['where'] ) ){<br>             throw new exception("更新语句必须有where子句指定条件");<br>         }<br><br>         return $this-&gt;sql;<br>     }<br><br>     //解析删除sql语句<br>     public function ParseDeleteSql()<br>     {<br>         $this-&gt;sql = 'delete from ';<br>         if( empty( $this-&gt;alias['table'] ) ){<br>             throw new exception("请用table子句设置删除表");<br>         }else{<br><br>             $this-&gt;sql .= $this-&gt;alias['table'];<br>         }<br><br>         if( empty( $this-&gt;alias['where'] ) ){<br>             throw new exception("删除语句必须有where子句指定条件");<br>         }<br><br>         $this-&gt;sql .= ' where ' . $this-&gt;alias['where'];<br><br>         return $this-&gt;sql;<br>     }<br><br><br>     //查询语句<br>     public function select()<br>     {<br>         $this-&gt;ParseSelectSql();<br>         $row = $this-&gt;conn-&gt;query( $this-&gt;sql )-&gt;fetchAll( PDO::FETCH_ASSOC );<br>         $result = [];<br><br>         foreach( $row as $key=&gt;$vo ){<br><br>             $arrObj = clone $this;  //clone当前对象防止对this对象造成污染<br>             $arrObj-&gt;data = $vo;<br>             $result[$key] = $arrObj;<br>             unset( $arrObj );<br>         }<br><br>         return $result;<br>     }<br><br>     //查询一条<br>     public function find()<br>     {<br>         $this-&gt;ParseSelectSql();<br>         $row = $this-&gt;conn-&gt;query( $this-&gt;sql )-&gt;fetch( PDO::FETCH_ASSOC );<br><br>         $arrObj = clone $this;  //clone当前对象防止对this对象造成污染<br>         $arrObj-&gt;data = $row;<br>         $result = $arrObj;<br>         unset( $arrObj );<br><br>         return $result;<br>     }<br><br>     //添加数据<br>     public function add( $data )<br>     {<br>         if( !is_array( $data ) ){<br>             throw new exception("添加数据add方法参数必须为数组");<br>         }<br><br>         $this-&gt;ParseAddSql();<br>         foreach( $data as $key=&gt;$vo ){<br>             $this-&gt;sql .= " `{$key}` = '" . $vo . "',";<br>         }<br><br>         $this-&gt;conn-&gt;exec( rtrim( $this-&gt;sql, ',' ) );<br>         return $this-&gt;conn-&gt;lastInsertId();<br>     }<br><br>     //更新语句<br>     public function update( $data )<br>     {<br>         if( !is_array( $data ) ){<br>             throw new exception("更新数据update方法参数必须为数组");<br>         }<br><br>         $this-&gt;ParseUpdateSql();<br>         foreach( $data as $key=&gt;$vo ){<br>             $this-&gt;sql .= " `{$key}` = '" . $vo . "',";<br>         }<br><br>         $this-&gt;sql = rtrim( $this-&gt;sql, ',' ) . ' where ' . $this-&gt;alias['where'];<br>         return $this-&gt;conn-&gt;exec( $this-&gt;sql );<br><br>     }<br><br>     //删除语句<br>     public function delete()<br>     {<br>         $this-&gt;ParseDeleteSql();<br>         return $this-&gt;conn-&gt;exec( $this-&gt;sql );<br>     }<br><br>     //获取查询数据<br>     public function getData()<br>     {<br>         return $this-&gt;data;<br>     }<br><br>     //获取最后一次执行的sql语句<br>     public function getLastSql()<br>     {<br>         return $this-&gt;sql;<br>     }<br><br>     public function __get($name)<br>     {<br>         return $this-&gt;getData()[$name];<br>     }<br><br>     public function offsetExists($offset)<br>     {<br>         if( !isset( $this-&gt;getData()[$offset] ) ){<br>             return NULL;<br>         }<br>     }<br><br>     public function offsetGet($offset)<br>     {<br>         return $this-&gt;getData()[$offset];<br>     }<br><br>     public function offsetSet($offset, $value)<br>     {<br>         return $this-&gt;data[$offset] = $value;<br>     }<br><br>     public function offsetUnset($offset)<br>     {<br>         unset( $this-&gt;data[$offset] );<br>     }<br> }你可以这么用:$orm = new MyOrm();<br><br> //查询语句<br> $res = $orm-&gt;table('user')-&gt;order('id desc')-&gt;select();<br> $res = $orm-&gt;table('user')-&gt;where("name='test'")-&gt;order('id desc')-&gt;select();<br> $res = $orm-&gt;table('user')-&gt;where(['id' =&gt; 1])-&gt;order('id desc')-&gt;find();<br> $res = $orm-&gt;table('user')-&gt;where("age &gt; 20")-&gt;group('group by name')-&gt;order('id desc')-&gt;limit(2)-&gt;select();<br> $res = $orm-&gt;table('user')-&gt;where("age &gt; 20")-&gt;group('group by name')-&gt;order('id desc')-&gt;limit('2,2')-&gt;select();<br><br> //你可以这样处理数据<br> foreach( $res as $key=&gt;$vo ){<br>     echo $vo-&gt;name . '<br>';<br> }<br> //也可以这样处理<br> foreach( $res as $key=&gt;$vo ){<br>     echo $vo['name'] . '<br>';<br> }<br> //还可以这样<br> foreach( $res as $key=&gt;$vo ){<br>     print_r( $vo-&gt;getData() ) . '<br>';<br> }<br><br> //添加数据<br> $data = [<br>     'name' =&gt; 'test1',<br>     'age' =&gt; 20,<br>     'password' =&gt; '21232f297a57a5a743894a0e4a801fc3',<br>     'salt' =&gt; 'domain'<br> ];<br> $res = $orm-&gt;table('user')-&gt;add( $data );<br><br> //更新数据<br> $res = $orm-&gt;table('user')-&gt;where(['id' =&gt; 4])-&gt;update( ['name' =&gt; 'sdfdsfdsd', 'salt' =&gt; '111'] );<br><br> //删除数据<br> $res = $orm-&gt;table('user')-&gt;where(['id' =&gt; 7, 'id' =&gt; 6])-&gt;delete();<br><br> //获取执行的sql语句<br> echo $orm-&gt;getLastSql();<br><br> var_dump($res);

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号