Функции замыкания описать массивом

StalkerClasses

Новичок
Есть вот такой простой пример:
PHP:
$filter = [];
$filter['select'] = ['id','title'];
$filter['where'] = ['id','>',5];
$rows = Pages::recSelect('get',$filter);
Возможно ли функции замыкания перевести в массив?
PHP:
$rows = Pages::recSelect('obj', function ($q) use ($filter){
    $q->select(['id','title']);
    $q->where('id','>',5);
    $q->where(function ($q) use ($filter){
        $q->where('id','<',3000);
        $q->orWhere('id','<',2000);
        $q->orWhere(function ($q) use ($filter){
            $q->where('id','<',1000);
            $q->orWhere('id','<',500);
        });
    });
});

// Формально этот запрос будет выглядеть что-то типа:
select uid,title from pages
WHERE id>5 AND (
    id < 3000 or id < 2000 or (
        id < 1000 or id < 500
    )
)
Как бы в этом случае мог выглядеть массив $filter если описать вот такое замыкание?
И есть ли какие то библиотеки которые позволяют это сделать...
 

StalkerClasses

Новичок
не надо так делать
Почему?

Единственное что нашел:

PHP:
$filter = [];
$filter['select']                         = ['id','title'];
$filter['where.10']                     = ['id','>',5];
$filter['where.20.where']                 = ['id','<',3000];
$filter['where.20.orWhere.10']             = ['id','<',2000];
$filter['where.20.orWhere.20.where']     = ['id','<',1000];
$filter['where.20.orWhere.20.orWhere']     = ['id','<',500];
$filter['where.30']                     = ['id','<',5];

$filter = [];
$filter['select']                         = ['id','title'];
$filter['where.10']                     = ['id','>',5];
$filter['where.20'] = [
    'where' => ['id','<',3000],
    'orWhere.10' => ['id','<',2000],
    'orWhere.20' => [
        'where' => ['id','<',1000],
        'orWhere' => ['id','<',500]
    ],
];
$filter['where.30']                     = ['id','<',5];
 
Последнее редактирование:

ksnk

прохожий
не надо так делать
А вдруг придется сериализовать запрос ? Или, боже упаси - передавать его json'ом...
Единственное что нашел:
Объясни, зачем это на самом деле нужно, ну и где "нашел", чтобы там не смотреть больше никогда ... :)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А вдруг придется сериализовать запрос ?
есть такая устаревшая форма записи запросов к базе, текстом, SQL называется, она неплохо сериализует запросы к базе, несмотря на ее старомодность.
 

Yoskaldyr

"Спамер"
Партнер клуба
Темы в клубе в последнее время напоминают анекдот "Пап, а с кем ты сейчас разговаривал?" 🤪
 

StalkerClasses

Новичок
А вдруг придется сериализовать запрос ? Или, боже упаси - передавать его json'ом...

Объясни, зачем это на самом деле нужно, ну и где "нашел", чтобы там не смотреть больше никогда ... :)
Если нужно сериализовать - то стандартным способом в Laravel.
 

ksnk

прохожий
есть такая устаревшая форма записи запросов к базе, текстом, SQL называется, она неплохо сериализует запросы к базе, несмотря на ее старомодность.
У записи, от которой пытается избавится топикстартер(AR ?), по сравнению со "старомодным" sql, есть одно преимущество - кросс sql. Одна запись для запроса на, к примеру, Postgeress и Mysql.
То, чем собирается топикстартер заменить эту функциональную конструкцию имеет перед этой самой конструкцей единственное преимущество - ее будет возможно сериализовать и хранить в базе. При определенной ловкости рук - ее можно достаточно формально редактировать в каком-нибудь онлайн редакторе в админке.

Приведите пример что сериализовать...
В смысле ?

Вообще-то это я первый задал вопрос :)
Объясни, зачем это на самом деле нужно
 

флоппик

promotor fidei
Команда форума
Партнер клуба
У записи, от которой пытается избавится топикстартер(AR ?), по сравнению со "старомодным" sql, есть одно преимущество - кросс sql. Одна запись для запроса на, к примеру, Postgeress и Mysql.
И за двадцать с лишним лет я не видел ни одного человека, который бы такое сделал.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
можно уверенно утверждать, что старомодный SQL в этой задаче будет точно так же без изменений одинаково работать и на Mysql, и на Postgres - они оба реализуют стандарт ANSI, и чем дальше - тем ближе
 

ksnk

прохожий
И за двадцать с лишним лет я не видел ни одного человека, который бы такое сделал.
Где-то, вероятно, в уголке хнычут разработчики плагинов для больших CMS. Им то приходится заботиться о том, чтобы юзер мог менять драйвер базы как ему нужно.
старомодный SQL...
Ну, постгресс, может быть и крут,а остальные ?
А limit слабо записать на ansi sql, так чтобы все всё поняли?..
Код:
-- DB2
select * from table fetch first 10 rows only
-- Informix
select first 10 * from table
-- Microsoft SQL Server and Access
select top 10 * from table
-- MySQL and PostgreSQL
select * from table limit 10
-- Oracle
select * from (select * from table) where rownum <= 10
 
Последнее редактирование:

флоппик

promotor fidei
Команда форума
Партнер клуба
Осталось еще найти причину сериализовывать запрос на постраничку.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Дорогой @ksnk, с фантазией у тебя очень неплохо. Дело в том, что большинство участников этого форума заняты "скучным" проектированием реальных систем по функциональным требованиям от реальных людей за деньги.
Здесь нет тех, кому интересно проектирование абстрактных CMS под Informix и OracleDB. Прости, ты просто не в том месте это пишешь. Моя роль модератора позволяет про это рассказать.
 
Сверху