在Symfony中直接运用SQL语句检索数据

来源:互联网 发布:最好用安卓日历软件 编辑:程序博客网 时间:2024/06/05 17:34

      Symfony 框架中,Critteria 用来检索数据,功能已经足够强大了。但是,如果不习惯这种写法,还是比较闹心的。幸运的是,Symfony框架提供了另外一种数据库检索方法,自定义SQL语句检索数据。下面,笔者就根据实践来简述一下该方法。

  • 检索数据表
  • 结果集处理

检索数据表

         还是先看一段代码:
   1: $con    = Propel::getConnection();
   2:  
   3: $query = 'select %s.*, %s.name from %s left join %s on %s=%s where %s = ?';
   4: $query = sprintf($query,
   5:  DbUserPeer::TABLE_NAME,
   6:  DbAuthorityGradePeer::TABLE_NAME,
   7:  DbUserPeer::TABLE_NAME,
   8:  DbAuthorityGradePeer::TABLE_NAME,
   9:  DbUserPeer::AUTHORITY_GRADE_ID,
  10:  DbAuthorityGradePeer::ID,
  11:  DbUserPeer::ID
  12: );
  13:         
  14: $stmt = $con->prepareStatement($query);
  15: $stmt->setInt(1,$user_id);
  16: $rs = $stmt->executeQuery();

      首先,创建数据库连接:$con    = Propel::getConnection();

      其次,SQL语句书写、过滤、解析。

   1: $query = 'select %s.*, %s.name from %s left join %s on %s=%s where %s = ?';
   2: $query = sprintf($query,
   3:  DbUserPeer::TABLE_NAME,
   4:  DbAuthorityGradePeer::TABLE_NAME,
   5:  DbUserPeer::TABLE_NAME,
   6:  DbAuthorityGradePeer::TABLE_NAME,
   7:  DbUserPeer::AUTHORITY_GRADE_ID,
   8:  DbAuthorityGradePeer::ID,
   9:  DbUserPeer::ID
  10: );
  11:         
  12: $stmt = $con->prepareStatement($query);
  13: $stmt->setInt(1,$user_id);

      注意:%s 表示一个字符串,可以是表名、字段名、表.字段; ? 则表示参数,参数需要 $stmt->setInt(1,$user_id); 来传递,其中setInt()第一个参数表示参数索引,就是第几个参数(或者说是sql语句中的?)。可以从接口文件 PreparedStatement.php 中得到更详细的信息。

      最后,执行语句:$rs = $stmt->executeQuery();

结果集处理

      首先,看看结果集的类型如何:

MySQLResultSet Object ( [fetchmode:protected] => 1 [conn:protected] => MySQLConnection Object ( [database:private] => test [transactionOpcount:protected] => 0 [dblink:protected] => Resource id #78 [dsn:protected] => Arra…

      很明显,返回的是一个对象。

      其次,让我们来遍历结果集,还是先看代码

   1: $result = array();
   2: while ($rs->next()){
   3:     $arrTemp             = array();
   4:     $arrTemp['id']            = $rs->getInt('id');
   5:     $arrTemp['user_name']        = $rs->getString('user_name');
   6:     $arrTemp['user_id']        = $rs->getString('user_id');
   7:     $arrTemp['contact_company']    = $rs->getString('contact_company');
   8:     $arrTemp['contact_phone']    = $rs->getString('contact_phone');
   9:     $arrTemp['contact_email']    = $rs->getString('contact_email');
  10:     $arrTemp['authority']        = $rs->getString('name');
  11:     $result[]            = $arrTemp;
  12: }

      以上代码很明显是把结果集转换为数组。这个是项目需要,当然可以直接引用咯。

      最后,如何判断是否返回数据、返回多少数据。

   1: $rs->getRecordCount();

      将返回记录条数,当然,如果值为零,表示无记录返回。

 

结语

      next()、getInt()、getString等均可以在 interface ResultSet.php 文件中找到更详细的信息。

原创粉丝点击