4

你们中是否有人知道一个可以帮助您构建/操作 SQL 查询、支持 JOIN 的库?

如果你有一些东西可以返回一个对象,它有一些查询集,并且仍然能够对其应用 JOIN、子查询等,它会提供很大的灵活性。

我四处搜索,只找到了 SQL Builder,它看起来很基础,不支持连接。这将是一个真正使它有用的主要功能。

4

10 回答 10

7

也许您可以尝试ORM,例如PropelDoctrine,它们具有很好的编程查询语言,并且它们会返回代表数据库中行的对象数组...

例如,使用 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);

你可以用这两者做更多的事情......

于 2008-10-19T07:46:16.960 回答
4

Zend FrameworkZend_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 包,这可能是你要走的路。

于 2008-10-20T16:12:04.397 回答
1

如果您已经在使用 PDO,FluentPDO 看起来不错:https ://github.com/envms/fluentpdo

于 2014-02-06T19:40:03.860 回答
1

我强烈推荐 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 服务包装为模型,甚至让它在数据库中的数据和远程数据之间进行连接!这是非常聪明的东西。

希望这可以帮助 :)

于 2008-10-19T12:51:26.327 回答
1

来自 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
   );
 }
于 2011-11-10T14:12:22.150 回答
0

我建议使用 PHP 框架,例如 Symfony,它默认使用 Propel,如果您愿意,可以使用 Doctrine。

CakePHP 也使用 ORM,但我不知道是哪一个。

于 2008-10-19T11:41:09.170 回答
0

这似乎是一个具有复杂连接支持的 SQL 构建器:http: //laravel.com/docs/queries

于 2013-10-25T17:59:15.607 回答
0

我使用phptoolcase 库中的查询生成器,它使用 pdo 连接器,具有连接支持。

http://phptoolcase.com/guides/ptc-qb-guide.html

您可以将它与库中的连接管理器一起使用,以非常快速地设置多个数据库连接。

于 2014-11-08T16:32:18.080 回答
0

试试 magsql https://github.com/maghead/magsql,这是一个用 PHP 编写的为性能而设计的 SQL 构建器,带有连接支持和跨平台 SQL 生成。

目前用在最快的纯 PHP orm "maghead"

于 2015-04-16T02:35:33.367 回答
-1

您可以使用 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();

从 github 下载

于 2015-04-28T22:29:19.953 回答