Вычисляемые поля с опцией nestTables для MySQL Query в NodeJS

Я использую опцию 'nestTables' в приведенном ниже коде, чтобы разделить данные, возвращенные из запроса SQL, в соответствующие таблицы. Я также включаю в свой запрос вычисляемое поле, которое я хотел бы включить в основную таблицу.

В качестве примера я выполняю следующий маршрут:

router.route('/person/:personId').get(function(req,res){
    var person_id = req.params.personId;
    db.getConnection(function(err, connection) {
        if (err) {
            return res.status(503).send({ result: false, error: 'CONNECTION error: ' + err.code});
        } else {
            var sqlString='SELECT *, someField - 1 as calculated FROM person LEFT JOIN person_status ON person.id = person_status.person_id WHERE person.id = ' + person_id;
            var options={sql:sqlString,nestTables:true};
            connection.query(options, function(error, rows, fields) {
                connection.release();

                var nestingOptions = [
                    {tableName: 'person', pkey:'id'},
                    {tableName: 'person_status', pkey:'id', fkeys:[{table:'person',col:'person_id'}]}
                ];

                if (error) {
                    return res.status(500).send({ result: false, error: 'QUERY ERROR: ' + error.code});
                } else {
                    return res.status(200).send(rows);                 
                }
            });
        }
    });
});

и я получаю следующий ответ JSON:

[
  {
    "person": {
      "id": 1,
      other person data . . . 
      "person_status": [
        {
          "id": 3,
          other data . . . 
        }
      ]
    },
    "person_status": {
      "id": 3,
      other data . . . 
    },
    "": {
      "calculated": 0
    }
  }
]

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

[
  {
    "person": {
      "id": 1,
      "calculated": 0
      other person data . . . 
      "person_status": [
        {
          "id": 3,
          other data . . . 
        }
      ]
    },
    "person_status": {
      "id": 3,
      other data . . . 
    }
  }
]

Есть ли способ, которым я могу включить вычисленное поле в таблицу персонала, или есть лучшее решение, которое подходит для этой проблемы?

Заранее спасибо!

1 ответ

Решение

Я вижу два варианта решения этой проблемы, один грязный способ использования SQL:

var sqlString = 'SELECT *, someField - 1 as calculated FROM person WHERE person.id=?';
sqlString = 'SELECT * FROM (' + sqlString + ') as person';
sqlString += ' LEFT JOIN person_status ON person.id = person_status.person_id';
var options={sql:sqlString, nestTables:true};
connection.query(options, [person_id], function(error, rows, fields) {

и очевидное решение с использованием JS:

var sqlString = 'SELECT *, someField - 1 as calculated FROM person LEFT JOIN person_status ON person.id = person_status.person_id WHERE person.id=?';
var options = {sql:sqlString, nestTables:true};
connection.query(options, [person_id], function(error, rows, fields) {
  rows.forEach(function(row) {
    row.person.calculated = row[''].calculated;
    delete row[''];
  });

Я не думаю, что есть более приятное решение для этого. Я даже проверил, есть ли возможность обмануть парсер FieldPacket или RowDataPacket, но не нашел способа подделать имя таблицы (без мартышки, исправляющей драйвер mysql).

Другие вопросы по тегам