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 文件中找到更详细的信息。