Как правильно использовать join в codeigniter с несколькими таблицами - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь соединить 5 таблиц в codeigniter, и у меня возникают проблемы с получением правильного результата, пожалуйста, помогите. Я думаю, что ошибка в моем запросе, но я не уверен.

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

Вот схема и БД. Надеюсь, это поможет

Схема

База данных

 public function get_receiving_details_mawb($id){

        $this->ops_db->select('d.quantity, e.sku_code, a.quantity AS actual, 
        abs(d.quantity - a.quantity) AS variance');
        $this->ops_db->from('sk_rcv_d a');
        $this->ops_db->where_in('a.rcv_id', $id);
        $this->ops_db->join('sk_rcv_h b', 'a.rcv_id = b.id', 'inner');
        $this->ops_db->join('sk_booking_h c', 'b.booking_id = c.id','inner');
        $this->ops_db->join('sk_booking_d d', 'c.id = d.book_id', 'inner');
        $this->ops_db->join('sk_item e', 'd.item_id = e.id', 'inner');
        $this->ops_db->group_by('d.id');//d.id
        $query = $this->ops_db->get();
        return $query->result_array();
    }

    public function get_rcvh_mawb($id) {

       $this->ops_db->where("mawb_no", $id);
       $query = $this->ops_db->get("sk_rcv_h");
       $how = array();
       foreach($query->result_array() as $row) {
         $id = $row['id'];
         $how[] = $id;
       }
       return $how; 
    }

-------------------------------
        $wat  = $this->wh_db->get_rcvh_mawb($mawb);
        $item_details = array();
        $items = array();
        $results  = $this->wh_db->get_receiving_details_mawb($wat);
        foreach($results as $res) {
          extract($res);
          if (! array_key_exists($sku_code, $items)) {
          $items[$sku_code] = array("sku_code" => $sku_code, "quantity" => 0, 
          "actual" => 0, "variance" => 0);
         }
         $items[$sku_code]['quantity'] = $quantity;
         $items[$sku_code]['actual'] += $actual;
         $items[$sku_code]['variance'] = $items[$sku_code]['quantity'] - 
         $items[$sku_code]['actual']; 
        }

        foreach($items as $res) {
        $item_details[] = array("sku" => $res['sku_code'], "qty" => 
        $res['quantity'], "actual" => $res['actual'], "variance" => 
        $res['variance']);
        }

        $final     = array("mawb_no" => $mawb, "status" => $stat_api, 
        "status_date" => $stat_api_date, "items" => $item_details);

Вот результат, который я получил:

     {
        "mawb_no": "MASTERPOD-1",
        "status": "Received",
        "status_date": "2019-05-27 19:35:42",
        "items": [
            {
                "sku": "RTISSUE",
                "qty": "50",
                "actual": 50,
                "variance": 0
            },
            {
                "sku": "ISOALCO",
                "qty": "102",
                "actual": 50,
                "variance": 52
            }
        ]
    }

Что я должен получить:

    {
        "mawb_no": "MASTERPOD-1",
        "status": "Received",
        "status_date": "2019-05-27 19:35:42",
        "items": [
            {
                "sku": "RTISSUE",
                "qty": "50",
                "actual": 50,
                "variance": 0
            },
            {
                "sku": "ISOALCO",
                "qty": "102",
                "actual": 102,
                "variance": 0
            }
        ]
     }

1 Ответ

0 голосов
/ 30 мая 2019

В соответствии с вашей схемой все работает нормально, но с внутренним объединением это дает вам все четыре возможных результата в соответствии с условиями в вашем примере, вам нужно точно указать, какой вы хотите получить результат при получении результата, вам нужно условие, добавив having условие, я смог имитировать желаемые результаты, я не уверен, что он будет действителен во всех случаях, но вы можете попробовать, и вы все равно поняли идею (условные входные данные или условные результаты):

$this->db->select('d.quantity, e.sku_code, a.quantity AS actual, abs(d.quantity - a.quantity) AS variance');
$this->db->from('sk_rcv_d a');
$this->db->where('a.rcv_id', $id);
$this->db->join('sk_rcv_h b', 'a.rcv_id = b.id', 'inner');
$this->db->join('sk_booking_h c', 'b.booking_id = c.id', 'inner');
$this->db->join('sk_booking_d d', 'c.id = d.book_id', 'inner');
$this->db->join('sk_item e', 'd.item_id = e.id', 'inner');
$this->db->having('actual = quantity');

В этом случае вам не нужно groub_by, и приведенный выше запрос даст вам следующее:

array(2) {
  [0] => array(4) {
    ["quantity"] => string(2) "50"
    ["sku_code"] => string(7) "RTISSUE"
    ["actual"] => string(2) "50"
    ["variance"] => string(1) "0"
  }
  [1] => array(4) {
    ["quantity"] => string(3) "102"
    ["sku_code"] => string(7) "ISOALCO"
    ["actual"] => string(3) "102"
    ["variance"] => string(1) "0"
  }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...