【发布时间】:2019-12-04 03:52:12
【问题描述】:
我有两个包含土地合同信息的数据库表。它们与land_contract_annual_price.land_contract_id -> land_contract.land_contract_id 相关。
表格'land_contract_annual_price'
如果土地合同在字段land_contract_price_type 中具有值“Rörligt pris”,则表中存在相关值
land_contract_annual_price。目前我正在做两个查询,每个表一个。然后我合并结果并将土地合同呈现为嵌套的 JSON 数组,如下所示:
版本 1
[
{
"land_contract_id":118,
"land_contract_name":"Avtalsnamn",
"location_id":71,
"land_contract_link":"",
"land_contract_notes":"",
"land_owner_id":2,
"land_contract_start_date":"2019-07-25",
"land_contract_end_date":"2023-07-25",
"land_contract_terminated":"false",
"land_contract_payment_interval":"Halv\u00e5rsvis",
"land_contract_price_type":"R\u00f6rligt \u00e5rspris",
"land_contract_fixed_annual_price":null,
"land_contract_annual_prices":[
{"year":1, "price":873.00},
{"year":2, "price":77289.00},
{"year":3, "price":8.00},
{"year":4, "price":0.00},
{"year":5, "price":8729.00}
]
}
]
如果土地合同在字段 land_contract_price_type 中的值为“Fast pris”,则表中没有相关值
land_contract_annual_price。在那种情况下,我会像这样呈现土地合同(最后没有额外的数组):
第 2 版
[
{
"land_contract_id":13,
"land_contract_name":null,
"location_id":null,
"land_contract_link":"https:\/\/www.something.com\/preview\/Sl%C3%A4pvdam%20Edda\/Kddal\/Bddkta\/Besika%20Markavtal%20%20Halmstad%202016-03-08.pdf?role=personal",
"land_contract_notes":"",
"land_owner_id":null,
"land_contract_start_date":"2016-03-08",
"land_contract_end_date":"2026-03-08",
"land_contract_terminated":"true",
"land_contract_payment_interval":"\u00c5rsvis",
"land_contract_price_type":"Fast \u00e5rspris",
"land_contract_fixed_annual_price":"6000.00"
}
]
我没想到的是,当我获取所有土地合同时,这个解决方案很糟糕。如果每当土地合同在land_contract_price_type 字段中的值为“Rörligt pris”时,我要对另一个表进行第二次查询,我将进行数百次额外查询。
当土地合同在 land_contract_price_type 字段中的值为“Rörligt pris”时,是否有办法通过一 (1) 个查询创建嵌套 JSON 数组?
谢谢!
下面是我当前的代码。
function read($pdo, $Id = null, $ResponseMessage = null) {
$params = [];
$array = [];
$sql = "SELECT lc.Id, lc.Name, lc.LocationId, l.Name AS LocationName, lc.Notes, lc.LandOwnerId, lo.Name AS LandOwnerName, lc.StartDate, lc.EndDate, lc.IsTerminated, lc.PaymentInterval, lc.PriceType, lc.FixedAnnualPrice, lc.Link, lc.Created, lc.Updated, lcap.AnnualPriceYear AS Year, lcap.AnnualPriceAmount AS Amount
FROM LandContract lc
LEFT JOIN Location l ON l.Id = lc.LocationId
LEFT JOIN LandOwner lo ON lo.Id = lc.LandOwnerId
LEFT JOIN LandContractAnnualPrice lcap ON lcap.LandContractId = lc.Id
ORDER BY lc.Id DESC, lcap.AnnualPriceYear DESC
";
if ($Id) {
$sql .= 'WHERE lc.Id = ?';
$params[] = $Id;
}
echo $sql;
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
while ($row = $stmt->fetch()) {
// Fields we want to extract from the select statement into the array
$select_fields = ['Id', 'Name', 'LocationId', 'LocationName', 'Link', 'Notes', 'LandOwnerId', 'LandOwnerName',
'StartDate', 'EndDate', 'IsTerminated', 'PaymentInterval',
'PriceType', 'FixedAnnualPrice ', 'Created', 'Updated'];
if (!isset($array[$row['Id']])) {
// initialize the subarray if it has not been set already
$array[$row['Id']] = array_intersect_key($row, array_flip($select_fields));
if ($row['Year'] != null) {
$array[$row['Id']]['AnnualPrices'] = [];
} else {
$array[$row['Id']]['AnnualPrice'] = $row['FixedAnnualPrice'];
}
}
if ($row['Year'] != null) {
$array[$row['Id']]['AnnualPrices'][] = ['Year' => $row['Year'], 'Amount' => $row['Amount']];
}
}
if (empty($array)) {
$ResponseMessage = new ResponseMessage();
$ResponseMessage->Status = 'Error';
$ResponseMessage->Message = 'No results';
echo json_encode($ResponseMessage, JSON_UNESCAPED_UNICODE);
exit;
}
$Response = array();
if ($ResponseMessage) {
$Response['Status'] = $ResponseMessage->Status;
$Response['Message'] = $ResponseMessage->Message;
}
$Response['LandContracts'] = array_values($array);
echo json_encode($Response, JSON_UNESCAPED_UNICODE);
$stmt = null;
}
【问题讨论】:
-
看来你会从实施SQL joins 中受益。假设您使用的是 MySQL,您可能希望在查询中使用 JSON functions。
-
@RoAchterberg 感谢您的回答。我曾经使用 LEFT JOIN 进行查询,但我不知道是否或如何获得该 JSON 结构。有什么建议吗?
-
我建议您查看 MySQL 提供的各种
JSON_*函数,以将您的结果检索为列数据的 JSON 编码表示形式。 -
@RoAchterberg JSON 函数不起作用。原来我的主机正在运行 Maria DB。我真的以为是 MySQL。
-
@RoAchterberg 有没有办法用 PHP(从一个 sql 查询)创建我想要的 JSON?
标签: php json multidimensional-array pdo relational-database