你们中是否有人知道一个可以帮助您构建/操作 SQL 查询、支持 JOIN 的库?
如果你有一些东西可以返回一个对象,它有一些查询集,并且仍然能够对其应用 JOIN、子查询等,它会提供很大的灵活性。
我四处搜索,只找到了 SQL Builder,它看起来很基础,不支持连接。这将是一个真正使它有用的主要功能。
你们中是否有人知道一个可以帮助您构建/操作 SQL 查询、支持 JOIN 的库?
如果你有一些东西可以返回一个对象,它有一些查询集,并且仍然能够对其应用 JOIN、子查询等,它会提供很大的灵活性。
我四处搜索,只找到了 SQL Builder,它看起来很基础,不支持连接。这将是一个真正使它有用的主要功能。
也许您可以尝试ORM,例如Propel或Doctrine,它们具有很好的编程查询语言,并且它们会返回代表数据库中行的对象数组...
例如,使用 Doctrine 你可以像这样进行连接:
$q = Doctrine_Query::create();
$q->from('User u')
->leftJoin('u.Group g')
->innerJoin('u.Phonenumber p WITH u.id > 3')
->leftJoin('u.Email e');
$users = $q->execute();
和推进:
$c = new Criteria(AuthorPeer::DATABASE_NAME);
$c->addJoin(AuthorPeer::ID, BookPeer::AUTHOR_ID, Criteria::INNER_JOIN);
$c->addJoin(BookPeer::PUBLISHER_ID, PublisherPeer::ID, Criteria::INNER_JOIN);
$c->add(PublisherPeer::NAME, 'Some Name');
$authors = AuthorPeer::doSelect($c);
你可以用这两者做更多的事情......
Zend Framework的Zend_Db包中的Zend_Db_Select可以执行以下操作:
// Build this query:
// SELECT p."product_id", p."product_name", l.*
// FROM "products" AS p JOIN "line_items" AS l
// ON p.product_id = l.product_id
$select = $db->select()
->from(array('p' => 'products'), array('product_id', 'product_name'))
->join(array('l' => 'line_items'), 'p.product_id = l.product_id');
(来自示例 11.54。Zend框架手册中的 join() 方法示例)
如果你不喜欢运行一个成熟的 ORM 包,这可能是你要走的路。
如果您已经在使用 PDO,FluentPDO 看起来不错:https ://github.com/envms/fluentpdo
我强烈推荐 CakePHP。它会根据表之间的关联自动为您创建连接。
假设你正在写博客:
app/model/post.php:
class Post extends AppModel {
var $hasMany = array('Comment');
}
app/controller/posts_controller.php:
function view($id) {
$this->set('post', $this->Post->read(null, $id));
}
app/views/posts/view.ctp:
<h2><?php echo $post['Post']['title']?></h2>
<p><?php echo $post['Post']['body']; /* Might want Textile/Markdown here */ ?></p>
<h3>Comments</h3>
<?php foreach($post['Comment'] as $comment) { ?>
<p><?php echo $comment['body']?></p>
<p class="poster"><?php echo $comment['name']?></p>
<?php } ?>
这就是您查看博客文章所需的全部内容,您的数据库模式已被读取和缓存。只要你保持它与约定一致,你就不必告诉蛋糕任何关于你的桌子是如何设置的。
posts:
id INT
body TEXT
created DATETIME
comments:
id INT
body TEXT
name VARCHAR
post_id INT
它具有支持 MySQL、MSSQL、PostgreSQL、SQLite、Oracle 等的适配器。您还可以将 web 服务包装为模型,甚至让它在数据库中的数据和远程数据之间进行连接!这是非常聪明的东西。
希望这可以帮助 :)
来自 PastaPHP 的基于超快 SQLObject 的 IteratorQuery
迭代资源
foreach(_from('users u')
->columns("up.email_address AS EmailAddress", "u.user_name AS u.UserName")
->left('userprofiles up', _eq('u.id', _var('up.id')))
->where(_and()->add(_eq('u.is_active',1)))
->limit(0,10)
->order("UserName")
->execute("myConnection") as $user){
echo sprintf(
'<a href="mailto:%s">%s</a><br/>',
$user->EmailAdress,
$user->UserName
);
}
我建议使用 PHP 框架,例如 Symfony,它默认使用 Propel,如果您愿意,可以使用 Doctrine。
CakePHP 也使用 ORM,但我不知道是哪一个。
这似乎是一个具有复杂连接支持的 SQL 构建器:http: //laravel.com/docs/queries
我使用phptoolcase 库中的查询生成器,它使用 pdo 连接器,具有连接支持。
http://phptoolcase.com/guides/ptc-qb-guide.html
您可以将它与库中的连接管理器一起使用,以非常快速地设置多个数据库连接。
试试 magsql https://github.com/maghead/magsql,这是一个用 PHP 编写的为性能而设计的 SQL 构建器,带有连接支持和跨平台 SQL 生成。
目前用在最快的纯 PHP orm "maghead"
您可以使用 lenkorm,这很容易:
select('contents)->left('categories ON categories.category.id = contents.category_id)->where('content_id = 1')->result();
或者您可以用作:
select('contents)->left('categories->using(categoru_id)->where('content_id = 1')->result();