Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SQL Builder for PHP, with JOIN support?

Are any of you aware of a library that helps you build/manipulate SQL queries, that supports JOIN's?

It would give a lot of flexibility i'd think if you have something where you could return an object, that has some query set, and still be able to apply JOIN's to it, subqueries and such.

I've search around, and have only found SQL Builder, which seems very basic, and doesn't support joins. Which would be a major feature that would really make it useful.

like image 929
David Avatar asked Dec 14 '22 06:12

David


2 Answers

Maybe you can try an ORM, like Propel or Doctrine, they have a nice programmatic query language, and they return you arrays of objects that represent rows in your database...

For example with Doctrine you can do joins like this:

$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();

And with 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);

and you can do a lot more with both...

like image 190
Christian C. Salvadó Avatar answered Dec 18 '22 00:12

Christian C. Salvadó


Zend_Db_Select from the Zend_Db package of the Zend Framework can do such things as:

// 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');

(from Example 11.54. Example of the join() method in the Zend Framework Manual)

If you don't like to run a full-blown ORM package, this could be the way to go.

like image 28
Stefan Gehrig Avatar answered Dec 18 '22 00:12

Stefan Gehrig