JOIN をサポートする SQL クエリの作成/操作に役立つライブラリを知っている人はいますか?
オブジェクトを返すことができ、クエリが設定されていて、JOIN、サブクエリなどを適用できるものがあれば、多くの柔軟性が得られると思います。
私は周りを検索しましたが、SQL Builder しか見つかりませんでした。これは非常に基本的なようで、結合をサポートしていません。これは、本当に便利になる主要な機能です。
JOIN をサポートする SQL クエリの作成/操作に役立つライブラリを知っている人はいますか?
オブジェクトを返すことができ、クエリが設定されていて、JOIN、サブクエリなどを適用できるものがあれば、多くの柔軟性が得られると思います。
私は周りを検索しましたが、SQL Builder しか見つかりませんでした。これは非常に基本的なようで、結合をサポートしていません。これは、本当に便利になる主要な機能です。
PropelやDoctrineのようなORMを試すことができるかもしれません。それらは優れたプログラムクエリ言語を備えており、データベース内の行を表すオブジェクトの配列を返します...
たとえば、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();
そしてPropelで:
$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');
( Zend Framework マニュアルのExample 11.54. Join() メソッドの例より)
本格的な ORM パッケージを実行したくない場合は、これが適している可能性があります。
パスタPHPの超高速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
);
}
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 サービスをモデルとしてラップし、データベース内のデータとリモート データを結合することもできます。とても賢い内容です。
お役に立てれば :)
magsqlを試すhttps://github.com/maghead/magsqlは、PHP で記述されたパフォーマンス用に設計された SQL ビルダーであり、結合のサポートとクロスプラットフォームの SQL 生成が付属しています。
現在、最速の純粋な PHP orm「maghead」で使用されています。
これは、複雑な結合をサポートする SQL ビルダーのようです: http://laravel.com/docs/queries
phptoolcase ライブラリのクエリ ビルダーを使用します。これは pdo コネクタを使用し、結合をサポートしています。
http://phptoolcase.com/guides/ptc-qb-guide.html
ライブラリの接続マネージャーと一緒に使用して、複数のデータベース接続を非常に迅速にセットアップできます。
デフォルトで Propel を使用し、必要に応じて Doctrine を使用できる Symfony などの PHP フレームワークを使用することをお勧めします。
CakePHP も ORM を使用していますが、どの ORM かはわかりません。
非常に簡単な 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();