有事没事来多放点。多放点就越来越专业。
关于Symfony 的 ORM
上一篇 /
下一篇 2008-02-22 10:14:40
Symfony 中操作
数据库使用的是
Propel,一个基于PHP5的ORM框架,和Symfony一样,完全
面向对象。它可以操作多种数据库,如:
MySQL、PostgreSQL、ORACLE、SQL
Server,所提供的功能基本上能满足大多数的数据库操作,如:
<?php //新建 $user = new User(); $user->setName('symfony'); $user->setAge(3); $user->save();
//查询 $user = UserPeer::retrieveByPk(1); echo $user->getName() . ' ' . $user->getAge() . '<br /> '; $users = UserPeer::retrieveByPks(array(1, 2, 3, 4)); foreach ($users as $user) { echo $user->getName() . ' ' . $user->getAge() . '<br /> '; }
// 更新 $user = UserPeer::retrieveByPk(1); $user->setName('new Name'); $user->save();
// 删除 UserPeer::doDelete(1); $user = UserPeer::retrieveByPk(1); $user->delete(); ?>
|
也支持一些复杂的查询操作,需要借助
Criteria,如:
<?php // 查询 name = 'symfony' 的记录 $c = new Criteria(); $c->add(UserPeer::NAME, 'symfony'); $users = UserPeer::doSelect($c);
//只查询一条记录 $user = UserPeer::doSelectOne($c);
//...也支持 group by、limit、table join 等等特性 ?>
|
但如果需要执行如下的一个SQL查询:
SELECT*FROMusersWHERECONCAT(first_name, '', last_name) = ?
|
,却无法直接使用 Criteria 来实现,只能直接手写 sql 语句,如:
<?php $query = "SELECT * FROM users WHERE CONCAT(first_name, ' ' , last_name) = %s"; $query = sprintf($query, 'symfony name'); $conn = Propel::getConnection(); $stmt = $conn->prepareStatement($query); $rs = $stmt->executeQuery(); while ($rs->next()) { echo $rs->getInt('id') . ': ' . $rs->getString('first_name') . '<br />'; } $rs->close(); ?>
|
这点上,ROR 中的 ActiveRecord
优势比较明显一些,如在 ROR 中可以这样操作:
users = User.find(:all, :conditions => ["CONCAT(first_name, last_name) = ?",'symfony
name']);
|
由于Ruby语言的天生优势,省了很多
代码,当然 ROR
所做的还远远不只这些。
Propel 依托 PHP5,借鉴了
Java 中的 JDBC,显得中规中矩,也很灵活,虽然不如 ROR 的
ActiveRecord 好用,但经过 Symfony 的改装,和 Symfony 搭配起来还是挺不错的。
导入论坛
收藏
分享给好友
管理
举报
TAG: