如何处理来自 Join Query 的 Parsing Object
How to deal with Parsing Object from Join Query
我目前正在使用 Perfect
框架开发我的第一个 API。自从我自己制作 API 以来已经有一段时间了,所以我必须承认我的 SQL
和 API
逻辑有点生疏。
我正在使用 MySQL 数据库来实现。
为了举例,我将在下面解释我的数据库结构;
我有一个类似于对象的 table,我们称之为 Table A
。 Table A
有一个基于 id
的 Varchar
作为主键。
还有 2 个 table,我们称它们为 Table B
和 Table C
。 Table A
与 Table B
和 C
都存在一对多关系。其中 table A
的 id
是外键。
我想做的是通过一个查询获取所有内容并将其转换为我后端中的一个对象。
通过使用 outer joins
我正在调用以检索所有必需的数据。
SELECT control.id, control.type, control.description, control.address, control.city, control.created, control.updated, control.latitude, control.longitude, images.id AS image_id, images.image, images.description AS image_description, updates.id AS update_id, updates.still_present, updates.created_at AS update_created
FROM Control control left outer join control_images images
ON control.id=images.control_id
left outer join Control_Updates updates
ON control.id=updates.control_id
现在我的问题是什么是将此数据存储在包含更新数组和图像数组的对象中的最佳方式。
在编写连接查询之前,我只尝试从 Table A
获取值,我使用以下代码将结果转换为我想要的对象。
let result = mysql.storeResults()
let checkResult = self.checkResult(result: result, response: response)
response = checkResult.response
var controls: [Control] = []
while let row = result?.next() {
let type = Types(rawValue: row[1].unwrap)!
let control = Control(id: row[0].unwrap, type: type, description: row[2].unwrap, address: row[3].unwrap, city: row[4].unwrap, latitude: Double(row[7].unwrap).unwrap, longitude: Double(row[8].unwrap).unwrap)
controls.append(control)
}
显然这只会 return 除了图像和更新之外的对象复制。
我想知道这是否是最好的方法,或者我是否应该在 while 循环中调用新查询
解决此问题的最佳方法是使用 'hashmaps',仍然只使用一个查询和一个循环。我不熟悉 Perfect 框架,但在 PHP 中它看起来像:
// Get results from the db:
$results = $db->execute($query, $params);
// Define map for controls:
$map = [];
// Loop over results/rows
foreach($results as $row){
// Get unique identifier for the Control model:
$controlId = $row['id'];
// Check if control is NOT already in map:
if(!isset($map[$controlId]){
// Add control to map:
$control = [
'id' => $controlId,
'description' => $row['description'],
'images' => []
// other fields
];
// Add control to map:
$map[$controlId] = $control;
}
else{
// Control exists, retrieve it from the map:
$control = $map[$controlId];
}
// Retrieve unique identifier of the image:
$imageId = $row['image_id'];
// Same tactic with hasmap, check if control already has the image, if not add it
if(!isset($control['images'][$imageId]){
// add the image to the hashmap:
}
else{
// Image is already added, the content from the 'update' data is not added yet, handle that part (also with a hash map)
}
}
希望能帮助你在Perfect framework中搞清楚
我目前正在使用 Perfect
框架开发我的第一个 API。自从我自己制作 API 以来已经有一段时间了,所以我必须承认我的 SQL
和 API
逻辑有点生疏。
我正在使用 MySQL 数据库来实现。
为了举例,我将在下面解释我的数据库结构;
我有一个类似于对象的 table,我们称之为 Table A
。 Table A
有一个基于 id
的 Varchar
作为主键。
还有 2 个 table,我们称它们为 Table B
和 Table C
。 Table A
与 Table B
和 C
都存在一对多关系。其中 table A
的 id
是外键。
我想做的是通过一个查询获取所有内容并将其转换为我后端中的一个对象。
通过使用 outer joins
我正在调用以检索所有必需的数据。
SELECT control.id, control.type, control.description, control.address, control.city, control.created, control.updated, control.latitude, control.longitude, images.id AS image_id, images.image, images.description AS image_description, updates.id AS update_id, updates.still_present, updates.created_at AS update_created
FROM Control control left outer join control_images images
ON control.id=images.control_id
left outer join Control_Updates updates
ON control.id=updates.control_id
现在我的问题是什么是将此数据存储在包含更新数组和图像数组的对象中的最佳方式。
在编写连接查询之前,我只尝试从 Table A
获取值,我使用以下代码将结果转换为我想要的对象。
let result = mysql.storeResults()
let checkResult = self.checkResult(result: result, response: response)
response = checkResult.response
var controls: [Control] = []
while let row = result?.next() {
let type = Types(rawValue: row[1].unwrap)!
let control = Control(id: row[0].unwrap, type: type, description: row[2].unwrap, address: row[3].unwrap, city: row[4].unwrap, latitude: Double(row[7].unwrap).unwrap, longitude: Double(row[8].unwrap).unwrap)
controls.append(control)
}
显然这只会 return 除了图像和更新之外的对象复制。
我想知道这是否是最好的方法,或者我是否应该在 while 循环中调用新查询
解决此问题的最佳方法是使用 'hashmaps',仍然只使用一个查询和一个循环。我不熟悉 Perfect 框架,但在 PHP 中它看起来像:
// Get results from the db:
$results = $db->execute($query, $params);
// Define map for controls:
$map = [];
// Loop over results/rows
foreach($results as $row){
// Get unique identifier for the Control model:
$controlId = $row['id'];
// Check if control is NOT already in map:
if(!isset($map[$controlId]){
// Add control to map:
$control = [
'id' => $controlId,
'description' => $row['description'],
'images' => []
// other fields
];
// Add control to map:
$map[$controlId] = $control;
}
else{
// Control exists, retrieve it from the map:
$control = $map[$controlId];
}
// Retrieve unique identifier of the image:
$imageId = $row['image_id'];
// Same tactic with hasmap, check if control already has the image, if not add it
if(!isset($control['images'][$imageId]){
// add the image to the hashmap:
}
else{
// Image is already added, the content from the 'update' data is not added yet, handle that part (also with a hash map)
}
}
希望能帮助你在Perfect framework中搞清楚