ORM源码地址
这个文档是针对本站提出的ORM对应定制的, 源码地址链接 http://www.wkwkk.com/article/f166522c5c3d490203fb2456bcdc37d0.html
连贯操作
以下是增删改查基本指令说明:
连贯操作查询语句 select from where order by limit
select(...)->from(...)->where(...)->having(...)->groupBy(...)->orderBy(...)->limit(...)->all()/row()/single() 这样的连贯操作方式是以构造形式取多行、取一行、取单个;
举例:
select id,name from prefix_article where is_shown = 1 order by update_time desc limit 50;
用本orm可以这样写:
// 类先继承基础模型,基础模型实例化Pdo操作类 $this->onRead() ->select('id,name') ->from('article') ->where([ 'is_shown' => 1 ]) ->orderBy('update_time desc') ->limit(50) ->row();
其中, 本orm采用了读、写、事务库调用分离的方式, 那么onRead()方法是调用读库。onWrite类似laravel框架当中orm用到的onWriteConnection方法, 顾名思义, 如果在$this指针后面调用onWrite()方法就是调用写库。onTrans()方法是调用事务。这三种方法返回的都是PDO被实例化后的对象。
from方法内传入的参数article不传数据表前缀是因为在配置对象当中prefix选项事先已经写好。
连贯操作左连接
->leftJoin([string 表名称], [string 表别名], [string on关键字后边的关系表达式])
如果使用了左连接, 一般来说都会在主表上设置别名, 联表时请给主表增加别名。
例如以下原生SQL语句:
select id from prefix_table_a a left join prefix_table_b as b on a.id = b.aid;
就可以写成以下连贯语句
$this->onRead() ->select('id') ->from('table_a', 'a') ->leftJoin('table_b', 'b', 'a.id = b.aid') // ->leftJoin('table_c', 'c', 'c.aid = a.id') ->all();
连贯操作非查询语句 insert update delete set values
连贯操作统一用go()方法来确定执行。
举例说明
sql原生插入语句, 其中两个?号各绑定到$v1, $v2两个PHP变量里
insert into prefix_member ( field1, field2 ) values ( ?, ? );
可以写成以下php连贯语句
$this->onWrite() ->insert('member') // 事先在数据库配置数组里面规定了prefix为"prefix_" ->values([ 'field1' => $v1, 'field2' => $v2, ]) ->go();
sql原生更新语句, 其中两个?号各绑定到$v1, $v2两个PHP变量
update prefix_member set field1 = ? where ( status = ? );
可以写成以下PHP连贯操作语句
$this->onWrite() ->update('member') ->set([ 'field1' => $v1, ]) ->where([ 'status' => $v2, ]) ->go();
sql原生删除语句, 其中?号绑定到PHP变量$v
delete from prefix_member where trashfield = ?;
可以写成以下PHP连贯操作语句
$this->onWrite() ->delete('member') ->where([ 'trashfield' => $v, ]) ->go();
原生语句
原生语句操作查询语句
sql(...)->bind(...)->all()/row()/single() 和上文一样, 为sql原生语句取多行、取一行、取单个;
以使用本orm实现上个原生sql语句的写法, 写法是:
$this->onRead() ->sql('select * from *_article where id = 6') ->row();
如果id传的参数是一个变量$id, 那么写法如下:
$this->onRead() ->sql('SELECT * FROM *_article WHERE id = ?') ->bind([ $id, ]) ->row();
其中bind方法传入的参数是按问号(?)出现的次序逐个在数组中出现的,内部实现仅是用pdo按次序绑定参数而已。
原生语句操作非查询语句
调用sql(...)->bind(...)->go() 的方法和上文一样, 也是为习惯于写原生非查询语句来实现的简单操作方式。
写法举例如下:
$this->onWrite() ->sql('insert into lalala ( fileda, fieldb ) values ( ?, ? )') ->bind([ $samplevalue_a, $samplevalue_b, ]) ->go();
缓存查询数据
在查询语句中使用在最后操作方法执行之前插入一句cache()方法就可以了, 支持两个可选参数,第一个参数是生存秒数,默认为30秒,第二个参数是自定义key值, 不写则orm自动根据sql去hash一个值。
代码例子:
$this->onRead() ->select('content') ->from('table_a') ->where([ 'id' => $id, ]) ->cache(5, 'arch_' . $id) ->single();
2 楼 IP 223.20.***.26 的嘉宾 说道 : 很久前