不管一个框架的数据库功能有多么强大,也不可能涵盖数据库的全部功能(甚至常用的部分)。
比如带有表达式或 OR 的查询条件,在现有的框架中并不好用。
例如 fleaphp 里面类似:
复制PHP内容到剪贴板
PHP代码:
$conditions =array(
array('Field1','Value1','LIKE','OR'),
array('Field2','Value2','=','OR'),
array('Field3','Value3','>'),
);
其他框架的我就不举例了,大同小异。
可以看出上面的写法是“违背直觉”的。也就是说原本很简单的 SQL语法还得用另一个复杂的方式表达出来。而且如果是非常复杂的查询,只有放弃框架提供的数据库功能,采用手写 SQL 语句来完成。
对于这种现状,我认为是不可接受的。所以在 qeephp 中,允许按照书写 SQL 语句的方式来构造查询:
复制PHP内容到剪贴板
PHP代码:
// 使用字符串做查询条件
Post::find('id = 1')
// 使用 ? 作为参数占位符
Post::find('id = ?', $id)
// 使用多个参数占位符
Post::find('id = ? AND level_ix > ?', $id, $level_ix)
// 使用数组提供多个参数占位符的值
Post::find('id = ? AND level_ix > ?', array($id, $level_ix))
// 使用命名参数
Post::find('id = :id AND level_ix > :level_ix', array('id' => $id, 'level_ix' => $level_ix))
// 使用名值对
Post::find(array('id' => $id, 'level_ix' => $level_ix));
// 使用 [ ] 来转义字段名
Post::find('[id] = 1');
Post::find('[posts.id] = 1');
// 使用表达式
$expr = new QDB_Expr('[hits] < AVG([hits])');
Post::find($expr);
可以看出,QeePHP 为开发者提供直观的方式来构造数据库查询操作。
除了常见的查询条件,在 order、group、sum、min 等各种操作中,都可以使用上面的语法。
可以豪不谦虚的说,qeephp 提供了迄今为止所有 php 开发框架中最强大、最灵活、最直观的数据库操作接口。
// 统计符合条件的 Post 对象总数
list($count) = Post::find('tix > 1 AND 'name' LIKE?',"%{$name}")->count()->query();
// 分页查询
$select = Post::find()->limitPage($page_number,$page_size);
$pagination = $select->getPagination();
$posts = $select->query();
// 进行强制关联查询(将 Post 关联的评论查询出来)
$posts =Post::find()->query('comments');
反正组合运用,绝大部分查询操作都不需要手写sql。