Как сделать строку из значений многомерного массива, используя родительские дочерние значения ? - Генератор динамических SQL запросов
это данные динамического массива. я упомянул ниже примеры данных из этого мне нужно сгенерировать SQL запрос
Я использую VueJs + Laravel. ниже я обновил массив данных и методы
[
{
"operator": "AND",
"rules": [
{
"id": 100,
"column": "dd_Tttp",
"type": "equal",
"value": true,
"join": "AND",
}
],
"groups": [
{
"operator": "AND",
"rules": [
{
"id": 200,
"column": "dd_tering",
"type": "equal",
"value": true,
"join": "AND",
},
{
"id": 201,
"column": "dd_Size",
"type": "in",
"value": "Standard",
"join": "AND",
},
{
"id": 202,
"column": "dd_Lotpth",
"type": "equal",
"value": "12",
"join": "AND",
}
],
"groups": [
{
"operator": "AND",
"rules": [
{
"id": 300,
"column": "dd_cat",
"type": "equal",
"value": "34",
"join": "AND",
},
{
"id": 301,
"column": "dd_Cot",
"type": "in",
"value": "Coftlassic",
"join": "AND",
},
{
"id": 302,
"column": "dd_dse",
"type": "equal",
"value": "2020-01-01",
"join": "AND",
},
{
"id": 303,
"column": "dd_turflaid",
"type": "equal",
"value": true,
"join": "AND",
}
],
"groups": [
]
}
]
}
]
},
{
"operator": "AND",
"rules": [
{
"id": 100,
"column": "dd_get",
"type": "equal",
"value": true,
"join": "AND",
},
{
"id": 101,
"column": "dd_ccc",
"type": "in",
"value": "Standard",
"join": "AND",
}
],
"groups": [
]
}
]
передавая выше данные массива в эту функцию я хочу выйти поставить вот так
(dd_Tttp = 'true' (dd_tering = 'true' AND dd_Size IN ('Standard') AND dd_Lotpth = '12' AND (dd_cat = '34' AND dd_Cot IN ('Coftlassic') AND dd_dse = '2020-01-01' AND dd_turflaid = 'true'))) AND (dd_get = 'true' AND dd_ccc IN ('Standard'))
groupQueryGen(groups){
let self = this;
let join = '';
let gggg = '';
$.each(groups, function(key, group) {
gggg = self.groupQueryGen(group.groups);
//console.log('group',gggg);
join = self.ruleQueryGen(group.rules);
join += join + '( '+gggg+' )';
});
return join ;
}
ruleQueryGen(rules){
let join = '';
$.each(rules, function(index, value) {
if(value)
{
if(value.type == 'equal'){
join += value.colum+" = '"+ value.value+"' "+value.join+" ";
}else if(value.type == 'not_equal'){
join += value.colum+" != '"+ value.value+"' "+value.join+" ";
}else if(value.type == 'in'){
join += value.colum+" IN ('"+ value.value+"') "+value.join+" ";
}else if(value.type == 'not_in'){
join += value.colum+" NOT IN ('"+ value.value+"') "+value.join+" ";
}else if(value.type == 'less'){
join += value.colum+" < '"+ value.value+"' "+value.join+" ";
}else if(value.type == 'less_or_equal'){
join += value.colum+" <= '"+ value.value+"' "+value.join+" ";
}else if(value.type == 'greater'){
join += value.colum+" > '"+ value.value+"' "+value.join+" ";
}else if(value.type == 'greater_or_equal'){
join += value.colum+" >= '"+ value.value+"' "+value.join+" ";
}else if(value.type == 'between'){
join += value.colum+" BETWEEN '"+ value.value+"' AND '" + value.valueTwo+ "' "+value.join+" ";
}else if(value.type == 'not_between'){
join += " NOT ("+value.colum+" BETWEEN '"+ value.value+"' AND '" + value.valueTwo+"') "+value.join+" ";
}else if(value.type == 'is_null'){
join += value.colum+" IS NULL "+value.join+" ";
}else if(value.type == 'is_not_null'){
join += value.colum+" IS NOT NULL "+value.join+" ";
}
}
});
return join;
}
У вопроса есть решение - Посмотреть?

Источник

Источник

Является ли эта структура обязательной , или мы можем предложить другую?
Источник

Источник

Источник

Я не понимаю, зачем вам нужно и то, и другое. Вы можете создать структуру без одного из двух, чтобы выразить любой набор правил
Источник

Источник

Источник

Для этого не нужно было иметь два разных реквизита. Рекурсивная группа может позаботиться об этом.
Источник
Ответы - Как сделать строку из значений многомерного массива, используя родительские дочерние значения ? - Генератор динамических SQL запросов / How to make string from multidimential array values using parent child values ? - Dynamic SQL query generator
Является ответом!

13.01.2020 04:23:08
Я бы использовал другую структуру, потому что:
- Нет необходимости делать различие между
operator
иjoin
. groups
иrules
должны быть действительно одним и тем же понятием. Если он должен иметь вложенные правила,то просто используйтеrules
илиin
свойствоbetween
действительно должно быть массивом. Синтаксический анализатор должен вводить запятые и другой синтаксис SQL. Не ставьте запятые внутри одной строки (хотя у вас нет таких примеров)- Избегайте разбора
value
иnot_between
отдельно; они точно такие же, какnot_is_null
иbetween
, но сis_null
Вот фрагмент кода, который производит SQL из этого:
NOT

игнорирование
join
не дает должного результата, в котором я нуждаюсь. я меняю один тип как Или но его изменение 3 места. но мне нужно одно место или условие здесь ? как бы это сказать ? drive.google.com/file/d/1S-nrrQu7D_b68AGGcWtvpnX91XVA2HqR/…

вы можете сделать это на PHP с моей структурой ?

Если вы хотите, чтобы между двумя выражениями было только или, вы должны окружить эти два выражения в отдельном правиле. Пожалуйста, не публикуйте изображения. Я взял пример с Вашего вопроса. Если у вас есть другой пример вывода, который, как вы думаете, этот код не может сделать, то, пожалуйста, отредактируйте свой вопрос и добавьте этот пример. Я уверяю вас, что любое возможное сочетание " и " и "или", где бы вы ни захотели, может быть выражено таким образом. Я не буду использовать вашу структуру по причинам, которые я объяснил в своем ответе. На мой взгляд, это не очень хорошая структура.

спасибо и я упомянул первую строку моего вопроса его динамические данные. таким образом, все значения могут быть изменены, включая join

Конечно. Есть ли у вас пример SQL, который, по вашему мнению, не может быть достигнут с помощью моего предложенного решения?

не кажется ли вам, что мы не получаем никаких требований
(condition1 AND cond2 OR cond3)
, как это ?? в любом случае я изменил структуру данных и удалил join

(condition1 AND cond2 OR cond3)
могут быть неоднозначными, если только мы не согласимся, что AND
имеет приоритет над OR
. В любом случае, было бы хорошей практикой четко указывать приоритет и использовать дополнительные паретезы: ( (condition1 AND cond2) OR cond3)
или (condition1 AND (cond2 OR cond3) )
. И то и другое может быть представлено в предлагаемой структуре данных.
Помочь в развитии проекта: