Как сделать строку из значений многомерного массива, используя родительские дочерние значения ? - Генератор динамических SQL запросов

Как сделать строку из значений многомерного массива, используя родительские дочерние значения ? - Генератор динамических SQL запросов

13.01.2020 12:19:41 Просмотров 20 Источник

это данные динамического массива. я упомянул ниже примеры данных из этого мне нужно сгенерировать 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;

}
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59713591/how-to-make-string-from-multidimential-array-values-using-parent-child-values#comment105579848_59713591
Является ли эта структура обязательной , или мы можем предложить другую?
https://stackoverflow.com/questions/59713591/how-to-make-string-from-multidimential-array-values-using-parent-child-values#comment105581464_59713591
Я не понимаю, зачем вам нужно и то, и другое. Вы можете создать структуру без одного из двух, чтобы выразить любой набор правил
https://stackoverflow.com/questions/59713591/how-to-make-string-from-multidimential-array-values-using-parent-child-values#comment105582078_59713591
Для этого не нужно было иметь два разных реквизита. Рекурсивная группа может позаботиться об этом.

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

Является ответом!
trincot

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

https://stackoverflow.com/questions/59713591/how-to-make-string-from-multidimential-array-values-using-parent-child-values/59717529#comment105593344_59717529
игнорирование joinне дает должного результата, в котором я нуждаюсь. я меняю один тип как Или но его изменение 3 места. но мне нужно одно место или условие здесь ? как бы это сказать ? drive.google.com/file/d/1S-nrrQu7D_b68AGGcWtvpnX91XVA2HqR/…
https://stackoverflow.com/questions/59713591/how-to-make-string-from-multidimential-array-values-using-parent-child-values/59717529#comment105593367_59717529
вы можете сделать это на PHP с моей структурой ?
https://stackoverflow.com/questions/59713591/how-to-make-string-from-multidimential-array-values-using-parent-child-values/59717529#comment105599707_59717529
Если вы хотите, чтобы между двумя выражениями было только или, вы должны окружить эти два выражения в отдельном правиле. Пожалуйста, не публикуйте изображения. Я взял пример с Вашего вопроса. Если у вас есть другой пример вывода, который, как вы думаете, этот код не может сделать, то, пожалуйста, отредактируйте свой вопрос и добавьте этот пример. Я уверяю вас, что любое возможное сочетание " и " и "или", где бы вы ни захотели, может быть выражено таким образом. Я не буду использовать вашу структуру по причинам, которые я объяснил в своем ответе. На мой взгляд, это не очень хорошая структура.
https://stackoverflow.com/questions/59713591/how-to-make-string-from-multidimential-array-values-using-parent-child-values/59717529#comment105604996_59717529
спасибо и я упомянул первую строку моего вопроса его динамические данные. таким образом, все значения могут быть изменены, включая join
https://stackoverflow.com/questions/59713591/how-to-make-string-from-multidimential-array-values-using-parent-child-values/59717529#comment105606117_59717529
Конечно. Есть ли у вас пример SQL, который, по вашему мнению, не может быть достигнут с помощью моего предложенного решения?
https://stackoverflow.com/questions/59713591/how-to-make-string-from-multidimential-array-values-using-parent-child-values/59717529#comment105616305_59717529
не кажется ли вам, что мы не получаем никаких требований (condition1 AND cond2 OR cond3), как это ?? в любом случае я изменил структуру данных и удалил join
https://stackoverflow.com/questions/59713591/how-to-make-string-from-multidimential-array-values-using-parent-child-values/59717529#comment105617329_59717529
(condition1 AND cond2 OR cond3)могут быть неоднозначными, если только мы не согласимся, что ANDимеет приоритет над OR. В любом случае, было бы хорошей практикой четко указывать приоритет и использовать дополнительные паретезы: ( (condition1 AND cond2) OR cond3)или (condition1 AND (cond2 OR cond3) ). И то и другое может быть представлено в предлагаемой структуре данных.
Закрыть X