我正在寻找纯粹的mysql和mysqli的分支,并尝试使用更好的数据库访问,而不是DAO层(这里增加了太多的复杂性)。
当我做一些Drupal开发时,我不得不使用它的数据库API。大部分时间都非常好,允许您构建查询并让它为您逃避一切。 PDO和mysqli准备好的语句并没有接近Drupal Database API的优点和清晰度。而且我仍然无法弄清楚如何使用mysqli中的预准备语句插入未知大小的行而不自行构建查询,从而破坏了预处理语句的用途。它只是阻碍了我的方式
Drupal API的实际代码示例
$query = db_select('tcsync_queue', 'q')
->condition('q.id', $post["tcsync_lastrecord"], '>')
->fields('q', array('id', 'uid', 'type', 'name', 'data'))
->execute();
foreach ($query as $item) {
$updateitem = array(
"id" => $item->id,
"uid" => $item->uid,
"type" => $item->type,
"name" => strtoupper($item->name),
"data" => $item->data);
....
}
是否有一个查询构建器可以完成一些接近Drupal的查询构建器?
答案 0 :(得分:1)
我认为你喜欢Doctrine 2的DBAL。 我会为你扔一些saple代码:
$locationIds = array(1,2,3,4,5,6,7);
$locationTreeDepthQb = $conn->createQueryBuilder();
$locationTreeDepthQb->select("COUNT(*) as count")
->from('location_tree_data', 'd')
->where("d.tree_depth >= 2")
->andWhere("d.tree_id IN (?)");
$stmt = $conn->executeQuery($locationTreeDepthQb->getSQL(), array($locationIds), array(Connection::PARAM_INT_ARRAY));
$res = $stmt->fetch();
请注意在此查询构建器中为“IN”SQL语句传递数组是多么容易。
答案 1 :(得分:1)
CodeIgniter做得非常好:
e.g。
选择
$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20);
$query = $this->db->get();
插入:
$this->db->set('title',$title)->insert('mytable');
更新
$this->db->where('id', $id)->set('title',$title)->update('mytable');
请参阅:http://codeigniter.com/user_guide/database/active_record.html
答案 2 :(得分:1)
您可能正在寻找NotORMHomepage PHP库。它非常轻量级(我认为这是你要求的)和一个独立的组件,所以你没有那么多的集成负担。
它与PDO一起用作连接对象:
include "NotORM.php";
$pdo = new PDO("mysql:dbname=software");
$db = new NotORM($pdo);
所以它支持PDO中可用的任何数据库。
然后您可以轻松地运行查询,这是带有应用程序表的数据库的示例:
foreach ($db->application() as $application) { // get all applications
echo "$application[title]\n"; // print application title
}
当涉及到地点和限制时,它的工作原理如下:
$applications = $db->application()
->select("id, title")
->where("web LIKE ?", "http://%")
->order("title")
->limit(10)
;
foreach ($applications as $id => $application) {
echo "$application[title]\n";
}
它做得很好,与类似的代码不同,例如codeigniter中的sql代码。
答案 3 :(得分:0)