О ПРОЕКТЕ
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.
Также есть еще ряд возможностей, описанных в документации.