как получить список result_array в row_array из активной записи codeigniter - PullRequest
0 голосов
/ 19 ноября 2018

Привет, нужно получить значение продукта и его вариант, так как есть один продукт, и его вариантов много, поэтому для отображения данных мне нужен результат в этом формате

[0] => Array
        (
            [id] => 4
            [cat_id] => 8
            [subcat_id] => 46
            [manu_id] => 108
            [pro_name] => sample product 1
            [slug] => sample-product-1
            [meta_title] => sample product 1
            [meta_desc] => sample product 
            [pro_desc] => sample product
            [feature_img] => 20181118100828.png
            [feature] => 0
            [view] => 0
            [created_at] => 2018-11-18 10:08:34
            [updated_at] => 
            [variant](
                     [0] =>  [sku_no] => JMS/20181118100834/0/4
                             [rprice] => 2500
                             [sprice] => 2000
                             [availability] => 1,
                     [1] =>  [sku_no] => JMS/20181118100834/0/4
                             [rprice] => 2500
                             [sprice] => 2000
                             [availability] => 1
                     )

Как я использую этот запрос:

public function GetProductData($id){
		$this->db->select('A.*, B.variant, sku_no, rprice, sprice, availability');
		$this->db->from('products A');
		$this->db->join('product_sku B','A.id = B.product_id');
		$this->db->where('A.id', $id);
		$query = $this->db->get();
		if($query->num_rows()>0){
			$results = $query->result_array();
			echo '<pre>';
			print_r($results);
			die;
		}
	}

Что дает мне результат в этом формате:

Array
(
    [0] => Array
        (
            [id] => 4
            [cat_id] => 8
            [subcat_id] => 46
            [manu_id] => 108
            [pro_name] => sample product 1
            [slug] => sample-product-1
            [meta_title] => sample product 1
            [meta_desc] => sample product 1sample product 1sample product 1sample product 1
            [pro_desc] => 
sample product 1sample product 1sample product 1sample product 1


            [feature_img] => 20181118100828.png
            [feature] => 0
            [view] => 0
            [created_at] => 2018-11-18 10:08:34
            [updated_at] => 
            [variant] => cotton large
            [sku_no] => JMS/20181118100834/0/4
            [rprice] => 2500
            [sprice] => 2000
            [availability] => 1
        )

    [1] => Array
        (
            [id] => 4
            [cat_id] => 8
            [subcat_id] => 46
            [manu_id] => 108
            [pro_name] => sample product 1
            [slug] => sample-product-1
            [meta_title] => sample product 1
            [meta_desc] => sample product 1sample product 1sample product 1sample product 1
            [pro_desc] => 
sample product 1sample product 1sample product 1sample product 1


            [feature_img] => 20181118100828.png
            [feature] => 0
            [view] => 0
            [created_at] => 2018-11-18 10:08:34
            [updated_at] => 
            [variant] => cotton medium
            [sku_no] => JMS/20181118100834/1/4
            [rprice] => 2500
            [sprice] => 1800
            [availability] => 1
        )

)

Я не хочу использовать в этом другую функцию, так как она замедлит процесс, если есть какое-либо решение mysql, кроме формы, использующей другую функцию внутри этой функции.

1 Ответ

0 голосов
/ 27 ноября 2018

Вы можете перебрать каждую строку набора результатов из продуктов, а затем сделать еще один запрос по product_sku.Это накладные расходы и неэффективно.Но, MYSQL group_concat - ваш друг здесь.

Идея состоит в том, чтобы объединить нужные поля, а затем сгруппировать их в списке выбора для каждого из вариантов.Затем вы можете взорвать их позже, чтобы создать реальный результат.убедитесь, что выбранные разделители не могут присутствовать в базе данных.

Что-то вроде:

$this->db->simple_query('SET SESSION group_concat_max_len = 1000000');
$q = $this->db->select("A.id,A.cat_id,A.subcat_id,A.manu_id,A.pro_name,A.slug,A.meta_title,A.meta_desc,A.pro_desc,
      A.feature_img,A.feature,A.view,A.created_at,A.updated_at, 
      GROUP_CONCAT(CONCAT(B.sku_no, 'æ',B.rprice,'æ',B.sprice,'æ',B.availability) SEPARATOR 'ø') as variants",FALSE)
  ->from('products A')
  ->join('product_sku B','A.id = B.product_id')
  ->where('A.id', $id)
  ->group_by('A.id,A.cat_id,A.subcat_id,A.manu_id,A.pro_name,A.slug,A.meta_title,A.meta_desc,A.pro_desc,
      A.feature_img,A.feature,A.view,A.created_at,A.updated_at')
  ->get();
$results = [];
foreach ($q->result_array() as $row) {
  $variants = array();
  if($row['variants']){
   foreach (explode('ø',$row['variants']) as $variant) {
     list($sku,$rprice,$sprice,$availability) = explode('æ',$variant);
     $variants[] = [
       'sku' => $sku,
       'rprice' => $rprice,
       'sprice' -> $sprice,
       'availability' => $availability
     ];
   }
  }
  $row['variant'] = $variants;
  unset($row['variants']);
  $results[] = $row;
}
return $results;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...