Организация данных MySQL по месяцам с использованием php / codeigntier - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно организовать дату входа пользователя по месяцам.В настоящее время я делаю это так в коде воспламенителя:

Код моей модели:

public function getApril(){
  $this->db->select('*');
  $this->db->where('Date >=','2018-04-01');
  $this->db->where('Date <=','2018-04-30');
  $this->db->from('user_data');
  $count = $this->db->count_all_results();
  return $count;
}

public function getMarch(){
  $this->db->select('*');
  $this->db->where('Date >=','2018-03-01');
  $this->db->where('Date <=','2018-03-31');
  $this->db->from('user_data');
  $count = $this->db->count_all_results();
  return $count;
}

public function getFebruary(){
  $this->db->select('*');
  $this->db->where('Date >=','2018-02-01');
  $this->db->where('Date <=','2018-02-28');
  $this->db->from('user_data');
  $count = $this->db->count_all_results();
  return $count;
}

Код моего контроллера:

public function index(){
  $data["april"]= $this->login_model->getApril();
  $data["march"]= $this->login_model->getMarch();
  $data["february"]= $this->login_model->getFebruary();
  $this->load->view('main/header');
  $this->load->view('main/body', $data);
  $this->load->view('main/footer');
}

И, на мой взгляд, я простоиспользуйте echo для отображения результата, например так:

<p><strong><?php echo $april?></strong></p>

Это выглядит как очень избыточный метод.Я уверен, что есть лучший способ сделать это.

Я попытался использовать 'group_by' примерно так: $this->db->group_by('MONTH(Date)');, но это возвращает только количество месяцев в базе данных, а не количество входов в системукаждый месяц.

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Вот попробуйте это:

файл вашей модели

public function getDataByMonth($start, $end){
  $this->db->select('*');
  $this->db->where('Date >=', $start);
  $this->db->where('Date <=', $end);
  $this->db->from('user_data');
  $count = $this->db->count_all_results();
  return $count;
}

затем создайте массив месяцев, который содержит название месяца, даты начала и окончания, как это, затем передайте его в функцию контроллера

$months = array(
    "january"   =>  array("01-01-2018", "31-01-2018"),
    "february"  =>  array("01-02-2018", "28-02-2018"),
    "march"     =>  array("01-03-2018", "31-01-2018")
);

последний в вашем контроллере

public function index($months){
    foreach ($months as $key => $value) {
        $data[$key] = $this->login_model->getDataByMonth($value[0], $value[1]);
    }
  $this->load->view('main/header');
  $this->load->view('main/body', $data);
  $this->load->view('main/footer');
}
0 голосов
/ 16 мая 2018

если вы хотите, чтобы все месяцы и годы ваше предложение с $this->db->group_by('MONTH(Date)') было довольно близко

Что-то вроде

Модель

public function getDataByMonth()
{
    $query = $this->db
        ->select('count(*) AS count, MONTH(Date) AS month, YEAR(Date) AS year')
        ->from('user_data')
        ->group_by('MONTH(Date)')
        ->group_by('YEAR(Date)')
        ->order_by('YEAR(Date)', 'DESC')
        ->order_by('MONTH(Date)', 'DESC')
        ->get();

    return $query->result();
}

Контроллер

public function index(){
    $this->load->view('main/header');
    $this->load->view('main/body', ['data' => $this->login_model->getDataByMonth()]);
    $this->load->view('main/footer');
}

вид

<?php
foreach ($data AS $obj)
{
    $objDateTime = DateTime::createFromFormat('n', $obj->month);
?>
    <p><strong><?php echo $objDateTime->format('F').' '.$obj->year.' | '.$obj->count; ?></strong></p>
<?php
}
?>  
0 голосов
/ 16 мая 2018

Вы можете использовать MONTH() метод

И просто используйте одну функцию для доступа к данным

public function getMonth($theMonthNumber){
  $this->db->select('*');
  $this->db->where('MONTH(Date)', $theMonthNumber);
  $this->db->from('user_data');
  $count = $this->db->count_all_results();
  return $count;
}

А, как считать каждый месяц вход?

Попробуйте с этим запросом

SELECT MONTH(Date) as the_month, COUNT(*) as the_value
FROM user_data
WHERE user_data.user_id = "the_user_id_i_send"
GROUP BY MONTH(Date)

Если вы используете это с codeigniter, функция будет выглядеть так

function some_function_name($user_id){
     $query = $this->db->query('the same query i wrote before')
           ->result_array();
     return $query;
 }

ожидаемый вывод должен быть массивом с ассоциативными ключами, связанными с месяцем, Пример вывода

  echo json_encode($query[0]); //the first month where the user has registers
  echo json_encode($query[3]); //the third month....and so on.. 

И, конечно, вы можете отфильтровать этот массив.

(Когда я вернусь домой, я постараюсь дополнить ответ.)

Надеюсь, мой ответ поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...