QeePHP 的 ORM 以 ActiveRecord 为基础,提供了完善的对象和对象关系的持久化能力。QeePHP 的 ORM 是为大规模应用进行过充分优化的,并且可以透明的工作在分布式数据库架构上。
创建模型最简单的办法就是使用 WebSetup 或者命令行脚本从数据表自动创建模型的代码文件,然后再根据需求进行定制。
只要准备好模型的代码文件,就可以利用 QeePHP 强大的 ORM 完成各种操作。下面的代码创建一个新用户,并且设置用户的个人信息,并且与好友建立关系,最后将新建的对象和对象关系保存到数据库:
// 新建一个 User 对象 $theone = new User(); $theone->name = 'theone'; // 为用户添加个人信息 $theone->profile = new Profile(); $theone->profile->address = 'Beijing'; $theone->profile->phone = '010-23234553'; // 为用户添加好友 $theone->friends()->add(User::find('name = ?', 'alex')->getOne()); $theone->friends()->add(User::find('name = ?', 'dick')->getOne()); // 保存 $theone->save();
保存后,我们可以任意的访问已有的对象:
// 查询 name 为 theone 的用户 $theone = User::find('name = ?', 'theone')->get(); // 显示他的个人信息 echo 'address: ' . $theone->profile->address; echo 'phone : ' . $theone->profile->phone; // 显示他所有好友的名字 echo 'friends: '; foreach ($theone->friends as $friend) { echo $friend->name; } // 更进一步,还可以访问好友的好友 echo 'friends networks:' foreach ($theone->friends as $friend) { echo $friend->name . ' friends: '; foreach ($friend->friends as $other_friend) { echo $other_friend->name; } } // 好吧,现在把 theone 的好友的好友变成 theone 的好友 foreach ($theone->friends as $friend) { foreach ($friend->friends as $other_friend) { $theone->friends()->add($other_friend); } } $theone->save();
事实上,对于开发者来说,只要两个对象之间存在关联,不管是直接的还是间接的,都可以通过 ORM 从一个对象导航到另一个对象。
例如:作者 -> 撰写的书籍 -> 读者 -> 阅读的书籍 -> 这些书籍的作者。
许多开发者担心这样的 ORM 会存在性能问题,所以这里先解释一下。
诸如“作者 -> 撰写的书籍 -> 读者 -> 阅读的书籍 -> 这些书籍的作者”这样的对象导航当然会导致多次数据库查询,但是以此来认为 QeePHP 的 ORM 性能不佳,其实是不正确的。
因为即便不使用任何 ORM,依赖于手工编写和优化的 SQL 查询,也不可能在一次查询中就从一个“作者”得到跨越了几层关系的“其他作者”的信息。所以,QeePHP 的 ORM 提供的这种对象导航能力并不等同于性能损失。
另一个更常见的误解就是:查询 10 篇文章及每篇文章的前 5 个评论。这种需求即便是手工编写的 SQL,也需要 10 次查询。所以开发者发现使用“一对多”关联导致多次查询就不应该意外了 :-)
除了一些无法避免的 SQL,QeePHP 的 ORM 已经做了大量的优化工作。并且利用延迟查询、in-memory 缓存、集合对象等技术来进一步减少和消除不必要的查询操作。