SQL Builder для PHP с поддержкой JOIN?

Кто-нибудь из вас знает о библиотеке, которая помогает вам создавать / управлять SQL-запросами, которая поддерживает JOIN?

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

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

Какой функциональности вы ищете? ОО-абстракция SQL? ORM? «Умный» конструктор запросов, с помощью которого вы можете передать список полей и список условий и позволить «волшебным образом» создать запрос для вас?

Sean McSomething 25.03.2009 01:43
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
1
8 124
10

Ответы 10

Может быть, вы можете попробовать 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 15.07.2011 23:24

@Stann Я согласен с вами, учитывая, что SQL сложнее, чем то, что делают проприетарные sql-подобные языки

Timo Huovinen 25.10.2013 21:54

Я бы посоветовал использовать 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
   );
 }

У вас есть ссылка на эту библиотеку?

Lenin Zapata 03.06.2018 21:00

Похоже, это построитель 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 ();

Скачать с github

Другие вопросы по теме