Кто-нибудь из вас знает о библиотеке, которая помогает вам создавать / управлять SQL-запросами, которая поддерживает JOIN?
Это дало бы большую гибкость, я бы подумал, если у вас есть что-то, где вы можете вернуть объект, у которого есть некоторый набор запросов, и по-прежнему иметь возможность применять к нему JOIN, подзапросы и тому подобное.
Я поискал и нашел только SQL Builder, который кажется очень простым и не поддерживает объединения. Что было бы важной особенностью, которая действительно сделала бы его полезным.






Может быть, вы можете попробовать 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);
и вы можете сделать намного больше с обоими ...
Что ж. многим это нравится. Но использование проприетарного sql-подобного языка для замены sql никогда не казалось мне правильным.
@Stann Я согласен с вами, учитывая, что SQL сложнее, чем то, что делают проприетарные sql-подобные языки
Я бы посоветовал использовать PHP-фреймворк, такой как Symfony, который по умолчанию использует Propel и при желании может использовать Doctrine.
CakePHP также использует ORM, но я не знаю, какой именно.
Я очень рекомендую 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 и других. Вы также можете обернуть веб-службы как модели и даже заставить их выполнять соединения между данными в вашей базе данных и удаленными данными! Это очень умная штука.
Надеюсь это поможет :)
Zend_Db_Select из пакета Zend_DbZend Framework может делать такие вещи, как:
// 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. Пример метода join () в Руководстве по Zend Framework)
Если вам не нравится запускать полноценный пакет ORM, это может быть подходящим вариантом.
сверхбыстрый IteratorQuery на основе SQLObject из pastaPHP
перебирает ресурс
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
);
}
У вас есть ссылка на эту библиотеку?
Похоже, это построитель SQL со сложной поддержкой соединения: http://laravel.com/docs/queries
FluentPDO выглядит неплохо, если вы уже используете PDO: https://github.com/envms/fluentpdo
Я использую конструктор запросов из библиотека phptoolcase, он использует коннектор pdo, имеет поддержку соединения.
http://phptoolcase.com/guides/ptc-qb-guide.html
Вы можете использовать его с диспетчером соединений для библиотеки, чтобы очень быстро настроить несколько соединений с базами данных.
Попробуйте magsql https://github.com/maghead/magsql, построитель SQL, разработанный для повышения производительности, написанный на PHP, поставляется с поддержкой объединения и кросс-платформенной генерацией SQL.
В настоящее время он используется в самой быстрой чистой PHP-орме "maghead".
Использовать ленкорм очень просто:
select ('content) -> left (' категории ON category.category.id = contents.category_id) -> where ('content_id = 1') -> result ();
или вы можете использовать как:
select ('content) -> left (' category-> using (category_id) -> where ('content_id = 1') -> result ();
Какой функциональности вы ищете? ОО-абстракция SQL? ORM? «Умный» конструктор запросов, с помощью которого вы можете передать список полей и список условий и позволить «волшебным образом» создать запрос для вас?