我们已经创建好了实体,下面就结合一个简单的留言板项目来看看实体的更多应用:数据的查、删、改操作。
1. 查询和删除
(1)DDA (Data Direct Accessor)
DDA的使用很简单,如下例:
class Action_index extends ActionBase { public function _run($request,$xcontext) { $dda = DDA::ins(); $info = $dda->list_msg(); $xcontext->info = $info; return XNext::useTpl('index.html'); } }
DDA 对象提供方便的对象的获取、删除的方法,可以根据方法名和参数沟通有条件的查询、删除的操作。 方法的规则如下:
[get | list | del]_classname_by_arg1name_arg2name($arg1value,$arg2value)
get 获取单个对象,未找到时 ,返回null
list 获取一批对象,为空时返回空数组
del 删除一批对象,无返回值
例如本例中用list_msg()获取msg数据表中所有的数据,返回对象的数组。在展示页面index.html输出对象时要注意:
1. 在输出msg数据表的数据时,id,ver,createtime和updatetime四个属性不能按照对象成员输出, 而应该按照方法来输出,即: echo $info[$i]->id; (错误) echo $info[$i]>id(); (正确) 我们自定义的属性则按照正常成员输出,例:echo $info[$i]->name; 2. 用DDA获取到的实体对象是可直接访问其关联的实体的,例如: echo $info[$i]->person->phone; 由于我们已经建立了msg关联person,所以在用DDA查询获取msg对象时可直接访问 其关联实体person下的成员或者方法。
(2)DQuery
DQuery和DDA非常相似:
class Action_index extends ActionBase { public function _run($request,$xcontext) { $dq = Dquery::ins(); $info = $dq->list_msg(); $xcontext->info = $info; return XNext::useTpl('index.html'); } } ?>
区别:DQuery查询获得的不是实体对象的数组,而是一个数组的数组,即查询到的每一条数据记录都是以数组的形式返回的,而不是像DDA一样以实体对象的形式返回。
(3)自定义查询语句
通过Query对象,自已编写sql,来实现复杂的多表查询或要求高性能的系统。
在/src/logic/bizdomain/dao下添加自定义的Query:
<?php class msgQuery extends Query { public function display_all() { $sql = "SELECT * FROM msg"; return $this->listByCmd($sql); } } ?>
这里我们自己定义了查询方法display_all,自定义的Query可以定义多个不同的查询方法。
注意:类名xxxQuery中的xxx要与数据表名一致
使用:
$info = DaoFinder::query("msgQuery")->display_all();
注意:DaoFinder::query返回值和DQuery一样是数组的数组,而不是对象的数组!!
小结:DDA和DQuery都是提供给我们常用的一些操作,他们的区别只在于返回值不同,DDA在查询关联对象时体现出了强大之处;而Query则能给我们提供自定义查询功能,这点上DDA和Dquery则爱莫能助了~(>_<)~
2. 修改
要完成修改需要在实体中添加业务方法:
<?php class person extends Entity {/*{{{*/ static public function createByBiz($name, $phone, $address) {/*{{{*/ $cls = __CLASS__; $obj = new $cls(EntityID::create(strtolower($cls))); $obj->name = $name; $obj->phone = $phone; $obj->address = $address; return Entity::createByBiz($obj); }/*}}}*/ public function update($name,$phone,$address) { $this->name = $name; $this->phone = $phone; $this->address = $address; } }/*}}}*/ ?>
通过DDA或其他方法获取到要修改的对象后直接调用update方法即可:$obj_change->update($new_name, $new_phone, $new_address);
F.A.H^_^Amber