[英]Echo nested JSON array from related database tables?
I have two database tables. 我有两个数据库表。 They are related with
land_contract_annual_price.land_contract_id
-> land_contract.land_contract_id
. 它们与
land_contract_annual_price.land_contract_id
> land_contract.land_contract_id
。
Table 'land_contract' 表'land_contract'
Table 'land_contract_annual_price' 表“ land_contract_annual_price”
When I read from land_contract
, I want to echo a nested JSON array like this: 当我从
land_contract
读取时,我想像这样回显嵌套的JSON数组:
[
{
"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}
]
}
]
I'm using prepared statements with PDO to communicate with my database. 我在PDO中使用准备好的语句来与数据库通信。 This is the query I have right now:
这是我现在拥有的查询:
if (isset($_POST["land_contract_id"])){
$stmt = $pdo->prepare("SELECT * FROM land_contract AS lo
LEFT JOIN land_contract_annual_price AS loi
ON loi.land_contract_id = lo.land_contract_id
WHERE lo.land_contract_id = ?");
$stmt->execute([$land_contract_id]);
} else {
$stmt = $pdo->prepare("SELECT * FROM land_contract");
$stmt->execute();
}
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$arr[] = $row;
}
if(!$arr) exit('No rows');
echo json_encode($arr);
$stmt = null;
That gives me the JSON below, which is not what I want. 这给了我下面的JSON,这不是我想要的。 How can I structure my PHP to get the JSON array above?
如何构造PHP以获取上面的JSON数组?
[
{
"land_contract_id":127,
"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_price_id":1,
"land_contract_annual_price_year":1,
"land_contract_annual_price_amount":"873.00"
},
{
"land_contract_id":127,
"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_price_id":2,
"land_contract_annual_price_year":2,
"land_contract_annual_price_amount":"77289.00"
},
{
"land_contract_id":127,
"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_price_id":3,
"land_contract_annual_price_year":3,
"land_contract_annual_price_amount":"8.00"
},
{
"land_contract_id":127,
"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_price_id":4,
"land_contract_annual_price_year":4,
"land_contract_annual_price_amount":"0.00"
},
{
"land_contract_id":127,
"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_price_id":5,
"land_contract_annual_price_year":5,
"land_contract_annual_price_amount":"8729.00"
}
]
Logic for @potiev: @potiev的逻辑:
if (isset($_POST["land_contract_id"]) {
// Get data from land_contract where land_contract_id is $land_contract_id. Store as $landContract.
if (land_contract_price_type == 'Rörligt årspris') {
// Get additional data from land_contract_annual_price where land_contract_id is $land_contract_id
// Attach land_contract_annual_prices to $landContract
// Echo $landContract as JSON
} else if (land_contract_price_type == 'Fast årspris') {
// Echo $landContract as JSON
}
} else {
// Get all land contracts in land_contract
For every land contract() {
if (land_contract_price_type == 'Rörligt årspris') {
// Get additional data from land_contract_annual_price
// Attach land_contract_annual_prices to land contract
}
Echo all land contracts as JSON
}
}
You can divide your query in two parts. 您可以将查询分为两部分。
if (isset($_POST["land_contract_id"])){
$stmt = $pdo->prepare("SELECT * FROM land_contract WHERE land_contract_id = ?");
$stmt->execute([$land_contract_id]);
$landContract = $stmt->fetch(PDO::FETCH_ASSOC);
if (isset($landContract)) {
if ($landContract['land_contract_price_type'] == 'Rörligt årspris') {
$landContract['land_contract_annual_prices'] = [];
$stmt = $pdo->prepare("SELECT land_contract_annual_price_year as year, land_contract_annual_price_amount as price FROM land_contract_annual_price WHERE land_contract_id = ?");
$stmt->execute([$land_contract_id]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$landContract['land_contract_annual_prices'][] = $row;
}
}
$arr[] = $landContract;
}
} else {
$stmt = $pdo->prepare("SELECT * FROM land_contract");
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$arr[] = $row;
}
}
if(!$arr) exit('No rows');
echo json_encode($arr);
$stmt = null;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.