Получите последнюю строку одного и того же идентификатора продукта для каждого уникального идентификатора платежа и обновите статус в другой таблице с помощью codeigniter - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть две таблицы, первая таблица называется payments см. Ниже

payments table

Я хочу получить самую последнюю payment_id (имеется в виду последний платеж) каждого product_id, см. выделенные строки, в этом случае я хочу получить product_id из 10, 9, 8, 3 и 6, но из самого последнего payment_id, который составляет 69, 68, 59, 58 и 55.

После того, как я получил все это, я хочу обновить статус в другой таблице с именем list_data, см. Справа:

update status

Эта таблица также имеет product_id тот же идентификатор продукта из таблицы payments.

В целом моя цель - обновлять статус каждого product_id, если были произведены платежи.
Ниже мой контроллер:

$data["exp_date"] = $this->Superadmin_model_CMS->get_all_detail_needed_again();

        $this->load->helper('date');

        foreach ($data["exp_date"] as $value) {

            $exp_date = $value->payment_endDate;
            $todays_date = date("Y-m-d");
            $today = strtotime($todays_date);
            $expiration_date = strtotime($exp_date);

            if ($expiration_date <= $today && $value->ad_status === 'active') {
                // if ($value->ad_status === 'active') {
                $update_status = 'inactive';
                $data = array('ad_status' => $update_status
                );
                $this->Listing_model->update_ads_status($value->list_data_id, $data);
                // }
            }
        }

Ниже моя модель

public function get_all_detail_needed_again() {
    $this->db->select('py.payment_id,py.user_id,py.product_id,py.product_name,py.txn_id,py.payment_gross,py.payer_email,py.payment_status,py.payment_date,py.payment_endDate,ld.ad_status,ld.list_data_id');
    $this->db->from('payments py');
    $this->db->join('list_data ld','py.product_id = ld.list_data_id');

    $this->db->order_by('py.payment_id','desc');
    $this->db->limit(1); //If I don't put limit the code doesn't get the latest payment_id but if write limit 1, it only get 1 row of product_id and payment_id
    $query = $this->db->get();

    if($query->num_rows() > 0){
       return $query->result();
    } else{
       return array();
    }

}

public function update_ads_status($id, $data) {

    $this->db->where('list_data_id', $id);
    $this->db->update('list_data', $data);

    return true;

}

В моей модели, если я не пишу предел 1, код не получает последнюю версиюpayment_id но если записать предел 1, он получит только 1 строку product_id и payment_id

Кто-нибудь может мне помочь? Спасибо

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Вы можете попытаться использовать подзапрос, чтобы сначала выбрать последний payment_id каждого product_id, попробуйте изменить модель следующим образом:

public function get_all_detail_needed_again() {
    $this->db->select('py.payment_id,py.user_id,py.product_id,py.product_name,py.txn_id,py.payment_gross,py.payer_email,py.payment_status,py.payment_date,py.payment_endDate,ld.ad_status,ld.list_data_id');
    $this->db->from('payments py');
    $this->db->where('`payment_id` IN (SELECT MAX(`payment_id`) FROM `payments` GROUP BY `product_id`)');
    $this->db->join('list_data ld', 'py.product_id = ld.list_data_id');
    $query = $this->db->get();

    if($query->num_rows() > 0){
       return $query->result();
    } else{
       return array();
    }

}
0 голосов
/ 08 ноября 2019

обновите вашу функцию следующим кодом:

public function get_all_detail_needed_again() {
    $this->db->select('py.payment_id,py.user_id,py.product_id,py.product_name,py.txn_id,py.payment_gross,py.payer_email,py.payment_status,py.payment_date,py.payment_endDate,ld.ad_status,ld.list_data_id');
    $this->db->from('payments py');
    $this->db->join('list_data ld','py.product_id = ld.list_data_id');
    $this->db->group_by('py.product_id'); //added this line
    $this->db->order_by('py.payment_id','desc');
    $query = $this->db->get();

    if($query->num_rows() > 0){
       return $query->result();
    } else{
       return array();
    }

}
...