有事没事来多放点。多放点就越来越专业。

关于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(1234));
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:

引用 删除 Guest   /   2008-03-04 01:14:48
5
OK
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

数据统计

  • 访问量: 44421
  • 日志数: 283
  • 图片数: 1
  • 建立时间: 2007-09-07
  • 更新时间: 2008-04-16

RSS订阅

Open Toolbar