I have two database tables. They are related with land_contract_annual_price.land_contract_id -> land_contract.land_contract_id.
Table 'land_contract_annual_price'

When I read from land_contract, I want to echo a nested JSON array like this:
[
{
"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. 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. How can I structure my PHP to get the JSON array above?
[
{
"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:
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
}
}

$arr[] = $row;