Создан класс для работы с pdo (для внутренних нужд).
Имеется следующее:
Абстрактный класс для создания моделей
SQL билдер запросов
Мини-кеширование повторяющихся запросов в пределах коннекта (включая проверку на измененные данные).
Abstract Methods:
where():
where() - array
[
"user" => "10",
["%and", "status/!=|number" => "rhfghdfgh$%^456456"],
[["type" => "admin"], ["%or", "type" => "advert"], ['%or', ["st" => 2], ["%or", "st" => 3]]],
['%and',"date/>=" => "//now()//"]
Result:
user = :user and status <> :status and (type = :type or type = :type1 or (st = :st or st = :st2)) and date >= now() or status = :status3
data:
( [user] => 10 [status] => 456456 [type] => admin [type1] => advert [st] => 2 [st2] => 3 [status3] => 1 )
Из многомерного массава с бесконечном количеством вложений создает читаемый шаблон для pdo (включая расстановку скобок, обработку свободных запросов типа "now()" и фильтрацию данных) и массив со списком ключей и значений для этого шаблона.
selectBy() - array
Example:
selectBy(array("count(*)","id"))
Result:
select count(*), id
Позволяет выгружать определенные значения из базы
+ группировка результатов для удобной выгрузки и работы с несколькими таблицами одновременно
selectBy(array("count(*) as count<-user","id<-user"))
Result:
Array (
[0] => stdClass Object
(
[user] => stdClass Object
(
[count] => 10
[id] => 17
)
)
)
orderBy() - array
Сортировка
Example:
orderBy(array("date"=>"asc"))
Result:
Iшаблон + order by date asc
limit() - array
Example:
limit(array("1"=>"100"))
Result:
LIMIT 1,100
data() - array
(for add and update methods)
Example:
data(array("id"=>"100","status"=>"2"))
Result:
id='100', status='2'
find() - Find data
Model::selectBy("COUNT(id)")->where(array("id"=>2))->find();
Model::selectBy("COUNT(id)")->find(array("id"=>2));
update() - Update data
Model::data(array("status"=>2))->where(array("id"=>2))->update();
Model::where(array("id"=>2))->update(array("status"=>2));
delete() - Delete data
Model::where(array("id"=>2))->dalete();
add() - Add data
Model::data(array("status"=>2,"name"=>"name"))->add();
Model::add(array("status"=>2,"name"=>"name"));
Builder environment "where": [[[],[[],[[],[...]]]]]
Levels of investments are divided brackets "()"
Attachment may contain:
array("%and/%or","key"=>"val")
Key may contain:
"key/rule|filter"
Example:
"id/>=|number"=>"1dfsg0456hfgh##$%"
For many tables:
"table->column/rule|filter"
Result:
id >= "10456"
Filters:
noSpec, noHtml, charNumber, char, number
Rules:
=, !=, >=, <=, >, <, like, in, not in
Про группировки подробнее:
$table = CollectTables::selectBy(
["users.login<-user","userGroups.name as groupName<-group","userGroups.permissions<-group"]
)->
table(["users", "userGroups"])->
find(
array("users->group" => "//userGroups.id//","users->id/<"=>1)
);
print_r($table->rows);
Result:
Array (
[0] => stdClass Object
(
[user] => stdClass Object
(
[login] => Demo User
)
[group] => stdClass Object
(
[groupName] => VIP
[permissions] => {"createFlow":"1"}
)
)
)
1 - Полезно ли это будет хоть кому-то кроме меня?
2 - В каком направлении двигаться и в чем косяки такого способа работы с базой?
3 - Интересно ли это вам и нужно ли это публиковать для всех?
4 - Хочет ли кто-то помочь развить эту библиотеку и протестировать для себя?