Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> QueryBuilder хитрых запросов
McLotos  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1292
Пользователь №: 28342
На форуме: 6 лет, 13 дней
Карма: 28




Всем привет. Пилю свой QB, возникли вопросы при создании запросов сложнее чем 2+2 =)
Вот что пока получилось
//select * from table where a=1
$query->select()->from(table)->where('a',1)

//select * from table where a=1 and b>2
$query->select()->from(table)->where('a',1)->where('b','>','2')

//select * from table where a=1 or b=2
$query->select()->from(table)->orwhere(array('a'=>'1', 'b'=>'2'))

//select * from table where a=1 and (b=2 or c=3)
$query->select()->from(table)->where('a',1)->orwhere(array('b'=>'2', 'c'=>'3'))


А вот эти не получилось сделать
select * from table where a=1 and b=2 or c=3
select * from table where a=1 or b>2
select * from table where (a=1 and b=2) or (c=2 and d=1)
select * from table where a=1 or (b=2 and c=3)
select * from table where (a=1 or b=2 and c=3) or (x=5 and y=4) and d =1

Подскажите как обычно реализовывают такие запросы. Где можно посмотреть пример кода?


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1787
Пользователь №: 20757
На форуме: 7 лет, 4 месяца, 23 дня
Карма: 187




Цитата (McLotos @ 22.12.2016 - 07:45)
А вот эти не получилось сделать

Для ZF2 это бы было как-то так:
$select->where->equalTo('a', 1)->and->equalTo('b', 1)->or->equalTo('c', 3);//1
$select->where->equalTo('a', 1)->or->greaterThan('b', 3);//2
$select->where->nest()->equalTo('a', 1)->and->equalTo('b', 2)->unnest()->or->nest()->equalTo('c', 2)->and->equalTo('d', 1)->unnest();//3

https://framework.zend.com/manual/2.2/en/mo...end.db.sql.html
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2064
Пользователь №: 36605
На форуме: 4 года, 4 месяца, 9 дней
Карма: 113




посмотри Eloquent Query Builder в Laravel

очень достойный пример QB
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
McLotos  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1292
Пользователь №: 28342
На форуме: 6 лет, 13 дней
Карма: 28




bestxp
Я его смотрел, но на нем я не понял как реализовать эти 5 запросов


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
kaww  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1787
Пользователь №: 20757
На форуме: 7 лет, 4 месяца, 23 дня
Карма: 187




Цитата (McLotos @ 22.12.2016 - 10:46)
но на нем я не понял как реализовать эти 5 запросов

https://laravel.com/docs/5.3/queries раздел Parameter Grouping
Не имел никогда дело с Eloquent Query Builder, но если сравнивать с ZF, то реализация в ZF2 смотрится (на уровне api) изящнее, имхо. Группировка условий через анонимные функции не выглядит удобным. Что если надо группировать внутри группировки? - функция в функции? Что как минимум не удобно при динамической генерации запроса (Например, реализовать аналог jira query на Eloquent Query Builder будет той еще задачей, если, конечно, нет альтернативы анонимным функциям)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
McLotos  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



武士道
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1292
Пользователь №: 28342
На форуме: 6 лет, 13 дней
Карма: 28




Ребят, мне кажется мы как обычно ушли от основной темы вопроса?
Может сделать как в Zend? Типа создание скобок в запросе это 2 отдельных метода? Тогда это позволит создавать любые запросы, но не будет на столько изящным на сколько хотелось =)


--------------------
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 15383
Пользователь №: 4190
На форуме: 9 лет, 4 месяца, 20 дней
Карма: 470




Флуд из темы убрал в отдельную тему http://phpforum.su/index.php?showtopic=91483&hl=


--------------------
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
bestxp  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



орангутанг
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 2064
Пользователь №: 36605
На форуме: 4 года, 4 месяца, 9 дней
Карма: 113




Цитата (kaww @ 22.12.2016 - 11:35)
Цитата (McLotos @ 22.12.2016 - 10:46)
но на нем я не понял как реализовать эти 5 запросов

https://laravel.com/docs/5.3/queries раздел Parameter Grouping
Не имел никогда дело с Eloquent Query Builder, но если сравнивать с ZF, то реализация в ZF2 смотрится (на уровне api) изящнее, имхо. Группировка условий через анонимные функции не выглядит удобным. Что если надо группировать внутри группировки? - функция в функции? Что как минимум не удобно при динамической генерации запроса (Например, реализовать аналог jira query на Eloquent Query Builder будет той еще задачей, если, конечно, нет альтернативы анонимным функциям)

Scope но это при использовании AR моделек
либо DBAL от Doctrine

но по мне так длинные все эти цепочки вызовов не очень, нежели анонимка, и да ничего в этом нет что будет замыкание в замыкании =)
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
chee  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Сын полка
Сообщений: 1941
Пользователь №: 38654
На форуме: 3 года, 5 месяцев, 22 дня
Карма: 46




McLotos, я бы на твоём месте просто взял готовый продукт и использовал. Сам же в подобной ситуации я поступил подругому. Обычные простые запросы, с where and использую что то такое
$query = \Query::get('Accounts', 'FindBy');
$query->setCriteria(array(
'id' => $id,
));

$qeury->fetch();


когда же что то сложнее чем пара условий, пишу обычный plain запрос и обвертываю его объектом

$query = \Query::get('Accounts', 'FindLastCreatedOrSynced');
$qeury->fetch();


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


--------------------
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации

Мой блог
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса