Кодирование данных json с помощью двух таблиц с помощью join

#php #json #mysqli

#php #json #mysqli

Вопрос:

Кто-нибудь знает о моей проблеме с моим кодом? У меня есть две таблицы: sales_details и sales_payment. Сведения о продажах, где вы можете увидеть все детали, а другая таблица предназначена для информации о платеже / транзакции. Сведения о продажах имеют первичный ключ, а таблица sales_payment имеет FK. Чтобы объединить все данные, я использовал оператор inner join .

Вот пример моих данных. Я запускаю пример запроса с помощью join . Все изображения являются результатом запроса. Я обрезал его, потому что не могу сделать длинный снимок экрана в альбомном режиме.

Таблица Сведений о продажах:
tbl_sales_details

Подробная таблица продаж (Продолжение):
tbl_sales_details1

Таблица платежей по продажам:
tbl_sales_payment tbl_sales_payment

Это то, что я пробовал:

 public function get_payment_info_by_id($payment_info_id) {
    $query = $this->db->query("SELECT * FROM tbl_sales_details AS tsd INNER JOIN tbl_sales_payments AS tsp ON tsp.sales_id = tsd.sales_id WHERE tsd.sales_id = $payment_info_id");
    
    echo json_encode($query->fetch_object());
}
 

Возвращенные данные в формате json:

json_data json_data

Как вы можете видеть, данные в формате JSON. Он не вернул все данные в tbl_sales_payment.

Я хочу вернуть свои данные json следующим образом:

 {
    sales_balance: "4601.60"
    sales_company: ""
    sales_cp: ""
    sales_date: "2021-01-12 01:26:33"
    sales_discount: "0.00"
    sales_dr: "5768"
    sales_height: "8.00"
    sales_id: "3"
    sales_media: "Sticker on Sintra"
    sales_net_amount: "8601.60"
    sales_particulars: "Authorized Personnel Only"
    sales_po: "100549"
    sales_price_unit: "4.00"
    sales_qty: "15.00"
    sales_si: "1794"
    sales_so: "1234"
    sales_total: "7680.00"
    sales_total_area: "128.00"
    sales_unit: "in"
    sales_vat: "921.60"
    sales_width: "16.00"
    "payments": [
      {
        payment_id: "3"
        payment_amount: "1000.00"
        payment_date: "2021-01-15"
        payment_remarks: ""
      },
      {
        payment_id: "4"
        payment_amount: "1000.00"
        payment_date: "2021-01-18"
        payment_remarks: ""
      },
      {
        payment_id: "5"
        payment_amount: "2000.00"
        payment_date: "2021-01-29"
        payment_remarks: ""
      }
    ]
}
 

Ответ №1:

Вуек,

попробуйте это,

 public function get_payment_info_by_id($payment_info_id) {
    $return_data = [];
    $query = $this->db->query("SELECT * FROM tbl_sales_details AS tsd INNER JOIN tbl_sales_payments AS tsp ON tsp.sales_id = tsd.sales_id WHERE tsd.sales_id = $payment_info_id");
    
    while ($obj = $query->fetch_object()) {
        $return_data[] = $obj;
    }

    echo json_encode($return_data);
}
 

Комментарии:

1. Выглядит хорошо! Возможно ли не повторять данные в таблице sales_details, чтобы избежать избыточности?

2. Возможно, но это проще с помощью кода. Вот так, $tsd_query = $this->db->query("SELECT * FROM tbl_sales_details WHERE sales_id=$payment_info_id"); $tsd_result = $tsd_query ->fetch_object(); $tsp_query = $this->db->query("SELECT * FROM tbl_sales_payments WHERE sales_id=$payment_info_id"); while ($obj = $tsp_query->fetch_object()) { $paymetns[] = $obj; } $tsd_result->payments = $payments; echo json_encode($tsd_result);