Вычисляемые поля с опцией 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).