О ПРОЕКТЕ

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.

Также есть еще ряд возможностей, описанных в документации.