简体   繁体   English

从相关数据库表中回显嵌套的JSON数组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM