Ежемесячный отчет в Codeigniter

0

Я разрабатываю проект, который является системой бронирования отелей.

Моя проблема в том, что я хочу, чтобы цикл каждый месяц, как 1, 2 января - февраль и так далее. Если его 1, то он получит всю строку, месяц 1 или январь, cout_created столбцом cout_created в таблице базы данных cout_created и добавьте всю прибыль для каждой записи, поместив ее позже в массив следующим образом:

$monthlyreport = [
   1 => 6000,
   2 => 5000,
   3 => 3000,
   4 => 12000,
   5 => 8000,
   6 => 4000,
   7 => 6000,
   8 => 9000,
   9 => 4000,
   10 => 6000,
   11 => 9000,
   12 => 4000,
]; 

Это схема таблицы базы данных mySQL для строки примера:

 Row Name      Row Data

id            9
gst_id        1
cout_tin      2018-07-01
cout_tout     2018-07-02
cout_nodays   1
cout_single   1
cout_double   2
cout_family   1
cout_roombal  13000
cout_billbal  1120
cout_totalbal 14120
cout_downbal  6500
cout_result   7620
cout_created  2018-07-15 09:34:12

Я использую PHP с картой Codeigniter.

  • 0
    Это трудно понять ... во-первых, я понимаю, что вы используете базу данных со структурой, которую вы показываете здесь в своем сообщении ... затем, что вы ищете за месяц? cout_created ? cout_tin ? cout_tout ? Это MySQL? MongoDB? Дайте больше подробностей об этом, и я постараюсь помочь вам. Если я так думаю, решение довольно простое.
  • 0
    его в cout_created сэр. это отметка времени, и я использую MySQL. Простите, сэр.
Показать ещё 4 комментария
Теги:
codeigniter

1 ответ

1
Лучший ответ

Что вам нужно сделать, это комбинировать запросы базы данных с простым циклом в PHP.

Во-первых, вы должны понять, как получить все значения за месяц. cout_created - это поле timestamp/datetime. В MySQL вы можете получить данные с помощью запроса, подобного этому:

SELECT * FROM yourtable WHERE MONTH(cout_created) = XX

Используя этот запрос, в PHP вы пойдете на это:

// Initialize the array
$monthlyreport = array();
// For each month we are gonna do the same
for ($month = 1; $month <= 12; $month++) {
    // We get the results with database library, changing the sql according to our needs.
    $sql = "SELECT cout_result FROM yourtable WHERE MONTH(cout_created) = " . $month; 
    $query = $this->db->query($sql);
    // The accum variable to sum all the profits.
    $sum = 0;      
    // And foreach record, we sum the value to the actual one.
    foreach($query->result() as $row) {
       $sum = $sum + $row->cout_result;
    }
    // When finish, save the result on the array and start again.
    $montlyreport[$month] = $sum;
}

Это был бы самый простой способ понять, как это сделать, но мы можем сделать это еще лучше. MySQL позволяет нам сделать то же самое, используя встроенную функцию SUM() непосредственно в MySQL, поэтому нам не нужно делать дополнительную обработку на PHP. Мы можем это сделать:

// Initialize the array
$monthlyreport = array();
// For each month we are gonna do the same
for ($month = 1; $month <= 12; $month++) {
    // But now we will get sum of the values instead of each value
    $sql = "SELECT SUM(cout_result) as profit FROM yourtable WHERE MONTH(cout_created) = " . $month; 
    $query = $this->db->query($sql);
    // And just save the profit
    $montlyreport[$month] = $query->row()->profit;
}

Я не тестировал его, так как у меня нет среды PHP для тестирования, но дайте мне знать, как это работает, и я соответствующим образом обновлю ответ.


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

SELECT SUM(cout_result) as profit, MONTH(cout_created) as mymonth FROM yourtable GROUP BY MONTH(cout_created)

При этом вам просто нужно выполнить итерацию с помощью foreach экономя каждую прибыль непосредственно mymonth

$sql = "SELECT SUM(cout_result) as profit, MONTH(cout_created) as mymonth FROM yourtable GROUP BY MONTH(cout_created)"
$query = $this->db->query($sql);
$monthlyreport = array();
foreach ($query->result() as $row) {
    $monthlyreport[$row->mymonth] = $row->profit;
}
  • 0
    Это работает Спасибо большое.
  • 0
    @Alpha_Bords Не за что. Рад, что помог тебе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню