Asked Dec 16th, 2021 9:40 a.m. 205 0 3
  • 205 0 3
0

Lấy giá trị trong 2 bảng SQL

Share
  • 205 0 3

Mình có 2 table products, pro_fields trong đó Table products gồm: pro_id, pro_name. Table pro_fields gồm: id, pro_id, field_key, field_value

Mình muốn lấy 1 product với kết quả là array( 'pro_id' => 1, 'pro_name' => 'sản phẩm 1', 'pro_fields' => [ [ 'id' => 1, 'pro_id' => 1, 'field_key' => 'abc', 'field_value' => 'xyz', ], [ 'id' => 2, 'pro_id' => 1, 'field_key' => 'abc', 'field_value' => 'xyz', ], [ 'id' => 3, 'pro_id' => 1, 'field_key' => 'abc', 'field_value' => 'xyz', ], ] );

Vậy mình query như thế nào.

Cảm ơn mọi người!

3 ANSWERS


Answered Dec 23rd, 2021 8:46 a.m.
Accepted
0

bạn thử ý tưởng này xem sao nhé 😃

<?php

function getProductById($prod_id){
    $sql = "select t1.pro_id,t2.pro_name,t2.* from products as t1 left join pro_fields as t2 on t1.pro_id = t2.pro_id where t1.pro_id = ".$pro_id;
    $result = $this->db->query($sql)->rows();
    $data = [];
    $count = -1;
    foreach($result as $key => $value){
            if(!in_array($value['pro_id'],$data)){
                $data[] = $value['prod_id'];
                $count++;
                $k = $count;
                $data[$k] = [];
            }else{
                $k = array_search($value['pro_id'],$data);
            }

            if(empty($data[$k]['field_key'])) $data[$k]['field_key'] = [];
            if(empty($data[$k]['pro_id'])) $data[$k]['pro_id'] = $value['pro_id'];
            if(empty($data[$k]['pro_name'])) $data[$k]['pro_name'] = $value['pro_name'];

            if($data[$k]['pro_id'] == $value['pro_id']){
                array_push($data[$k]['field_key'],[
                    'id'=>$value['id'],'pro_id'=>$value['pro_id'],
                    // ... any field you need table t2
                ]);
            }

    }
    return $data;
}

// ... connect object db
$products = getProductById($pro_id);

?>
Share
Answered Dec 20th, 2021 7:15 a.m.
+1

Mình giả định bạn biết cách thực thi câu truy vấn SQL trong PHP rồi nha. Bạn thực thi 2 câu truy vấn SQL là được nhé:

  • Một câu query lấy ra thông tin của 1 product dựa theo ID:
select * from products where prod_id = ?;
  • Câu query thứ 2 lấy ra danh sách các product fields:
select * from pro_fields where pro_id = ?;

Trong trường hợp bạn muốn lấy ra danh sách products chứ không phải 1 product như trong câu hỏi trên. Bạn thay phần mệnh đề WHERE sang dùng WHERE ... IN để tối ưu số lượng truy vấn phải thực thi.

select * from products where prod_id in (?, ?, ?);
select * from pro_fields where pro_id in (?, ?, ?);

Sau khi chạy xong 2 câu truy vấn, bạn sẽ chạy vòng lặp trong PHP để nhóm các pro_fields lại theo từng product. Đây cũng là cách để tránh lỗi N + 1 query mà Laravel framework đang áp dụng.

Share
Avatar Mr V @vinhdd
Dec 20th, 2021 9:02 a.m.

Cái này nó bất tiện nhĩ bạn. Trong Laravel thì có with nó có thể làm được phần này, mà trong php thuần mình k biết giải pháp như thế nào

0
| Reply
Share
Dec 20th, 2021 9:06 a.m.

@vinhdd Bạn có thể cài cái Eloquent của Laravel vào project bình thường để dùng mà. Mình cũng từng tích hợp bộ Eloquent của Laravel vào trong Wordpress cũng được. 😃

0
| Reply
Share
Answered Dec 17th, 2021 1:27 a.m.
0

Nếu bạn dùng laravel eloquent thì tìm hiểu về Relationships và hàm with nhé.

Share
Avatar Mr V @vinhdd
Dec 19th, 2021 9:58 a.m.

Mình dùng php thuần á

0
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.