О ПРОЕКТЕ
GreenPig (далее GP) – это небольшой помощник для работы с базой данных, который может дополнить функциональность любого, используемого вами php фреймворка (в том числе и самописного =) ).
Как и любой инструмент GP заточен под решение определенных задач. Он будет вам полезен, если вы предпочитаете писать запросы к БД на чистом sql и не используете Active record и прочие подобные технологии.
Но при таком подходе встает вопрос: как генерировать where часть sql запроса при поиске пользователями информации? GP нацелен, в первую очередь, на удобное составление средствами php where запроса любой сложности.
Также GP позволяет решать следующие задачи:
Во-первых, это получение не стандартного плоского ответа из БД, а вложенного, древовидного массива. Вот пример стандартной выборки из БД:
[ [0] => [ ['id'] => 1 ['type'] => 'car' ['val_id'] => 1 ['name'] => 'вес (кг)' ['value'] => 790 ], [1] => [ ['id'] => 1 ['type'] => 'car' ['val_id'] => 2 ['name'] => 'количество месяцев в эксплуатации' ['value'] => 24 ], [2] => [ ['id'] => 1 ['type'] => 'car' ['val_id'] => 3 ['name'] => 'лошадиные силы' ['value'] => 75 ], [3] => [ ['id'] => 4 ['type'] => 'phone' ['val_id'] => 10 ['name'] => 'диагональ экрана' ['value'] => 5 ], [4] => [ ['id'] => 4 ['type'] => 'phone' ['val_id'] => 8 ['name'] => 'вес (кг)' ['value'] => 0.12 ], [5] => [ ['id'] => 4 ['type'] => 'phone' ['val_id'] => 9 ['name'] => 'количество месяцев в эксплуатации' ['value'] => 1 ], [6] => [ ['id'] => 4 ['type'] => 'phone' ['val_id'] => 10 ['name'] => 'диагональ экрана' ['value'] => 5 ], [7] => [ ['id'] => 4 ['type'] => 'phone' ['val_id'] => 8 ['name'] => 'вес (кг)' ['value'] => 0.12 ], [8] => [ ['id'] => 4 ['type'] => 'phone' ['val_id'] => 9 ['name'] => 'количество месяцев в эксплуатации' ['value'] => 1 ], [9] => [ ['id'] => 4 ['type'] => 'phone' ['val_id'] => 10 ['name'] => 'диагональ экрана' ['value'] => 5 ], [10] => [ ['id'] => 4 ['type'] => 'phone' ['val_id'] => 8 ['name'] => 'вес (кг)' ['value'] => 0.12 ], [11] => [ ['id'] => 4 ['type'] => 'phone' ['val_id'] => 9 ['name'] => 'количество месяцев в эксплуатации' ['value'] => 1 ], [12] => [ ['id'] => 1 ['type'] => 'car' ['val_id'] => 1 ['name'] => 'вес (кг)' ['value'] => 790 ], [13] => [ ['id'] => 1 ['type'] => 'car' ['val_id'] => 2 ['name'] => 'количество месяцев в эксплуатации' ['value'] => 24 ], [14] => [ ['id'] => 1 ['type'] => 'car' ['val_id'] => 3 ['name'] => 'лошадиные силы' ['value'] => 75 ], [15] => [ ['id'] => 1 ['type'] => 'car' ['val_id'] => 1 ['name'] => 'вес (кг)' ['value'] => 790 ], [16] => [ ['id'] => 1 ['type'] => 'car' ['val_id'] => 2 ['name'] => 'количество месяцев в эксплуатации' ['value'] => 24 ], [17] => [ ['id'] => 1 ['type'] => 'car' ['val_id'] => 3 ['name'] => 'лошадиные силы' ['value'] => 75 ] ]
Чтобы получить древовидный массив нам необходимо либо самим приводить результат в нужный вид, либо делать N запросов к БД для каждого товара. А если нам нужна пагинация с сортировкой? GP способен решить эти проблемы. Вот пример выборки с GP:
[ [1] => [ ['prod_type'] => 'car' ['properties'] => [ [1] => [ ['name'] => 'вес (кг)' ['value'] => 790 ] [2] => [ ['name'] => 'количество месяцев в эксплуатации' ['value'] => 24 ] [3] => [ ['name'] => 'лошадиные силы' ['value'] => 75 ] ] ] [4] => [ ['prod_type'] => 'phone' ['properties'] => [ [10] => [ ['name'] => 'диагональ экрана' ['value'] => 5 ] [8] => [ ['name'] => 'вес (кг)' ['value'] => 0.12 ] [9] => [ ['name'] => 'количество месяцев в эксплуатации' ['value'] => 1 ] ] ] ]
И конечно при этом удобная пагинация и сортировка: ->pagination(1, 10)->sort('id')
.
Во-вторых если в БД хранятся некие сущности, и свойства этих сущностей динамические и задаются пользователями, то, когда вам понадобится поискать сущности по их свойствам, вам придется добавлять (join’ить) одну и туже таблицу со значениями свойств (столько же раз, сколько используется свойств при поиске). GP поможет вам и подключить все таблицы и сгенерировать where запрос практически одной функцией, подробнее в разделе QUERY/whereWithJoin().
В третьих GP может работать как с БД Oracle, так и с mySql.
Также есть еще ряд возможностей, описанных в документации.