SQL Builder для PHP, с поддержкой JOIN? - PullRequest
4 голосов
/ 19 октября 2008

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

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

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

Ответы [ 10 ]

6 голосов
/ 19 октября 2008

Может быть, вы можете попробовать ORM , например Propel или Doctrine , у них есть хороший программный язык запросов, и они возвращают вам массивы объектов, которые представляют строк в вашей базе данных ...

Например, с 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);

и вы можете сделать намного больше с обоими ...

4 голосов
/ 20 октября 2008

Zend_Db_Select из пакета Zend_Db Zend 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, это может быть путь.

1 голос
/ 06 февраля 2014

FluentPDO выглядит хорошо, если вы уже используете PDO: https://github.com/envms/fluentpdo

1 голос
/ 10 ноября 2011

сверхбыстрый 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
   );
 }
1 голос
/ 19 октября 2008

Я настоятельно рекомендую 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 и других. Вы также можете обернуть веб-сервисы в качестве моделей и даже заставить их выполнять соединения между данными в вашей базе данных и удаленными данными! Это очень умные вещи.

Надеюсь, это поможет:)

0 голосов
/ 29 апреля 2015

Вы можете использовать ленкорм, это очень просто:

выбор ('содержимое) -> слева (' категории ВКЛ категории.category.id = contents.category_id) -> где ('content_id = 1') -> результат ();

или вы можете использовать как:

выберите ('содержимое) -> слева (' категории-> используя (categoryoru_id) -> где ('содержимое_ид = 1') -> результат ();

Скачать с github

0 голосов
/ 16 апреля 2015

Попробуйте magsql https://github.com/maghead/magsql, построитель SQL, разработанный для производительности, написанной на PHP, с поддержкой соединений и кросс-платформенной генерацией SQL.

В настоящее время используется в самой быстрой чистой PHP-форме "maghead"

0 голосов
/ 08 ноября 2014

Я использую конструктор запросов из библиотеки phptoolcase , он использует коннектор pdo, имеет поддержку join.

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

Вы можете использовать его с менеджером соединений из библиотеки, чтобы очень быстро установить соединение с несколькими базами данных.

0 голосов
/ 25 октября 2013

Похоже, это SQL-компоновщик с поддержкой сложного соединения: http://laravel.com/docs/queries

0 голосов
/ 19 октября 2008

Я бы посоветовал использовать PHP-фреймворк, такой как Symfony, который по умолчанию использует Propel и может использовать Doctrine, если хотите.

CakePHP также использует ORM, но я не знаю, какой именно.

...