Lấy giá trị trong 2 bảng SQL
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 CÂU TRẢ LỜI
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);
?>
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.
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
@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.
Mình dùng php thuần á