0

ユーザーごとにグループ化されたデータベースクエリを表示する次のコードがあります。

$report_dates = $users->get_dates($startdate, $enddate);
foreach ($report_dates as $report_date_group) {
    $report_group = $users->get_jobs($userid, $report_date_group['job_date']);
    if ($report_group) {
        foreach ($report_group as $report_group_row) {
            $user_name  = $report_group_row['user_name'] . " " . $report_group_row['user_last'];
            $job_up_time  = '';
            $job_date     = datef($report_group_row['job_date'], "m/d/Y");
            $job_start    = datef($report_group_row['job_start'], "g:i a");
            $job_end      = datef($report_group_row['job_end'], "g:i a");
            $job_time     = decimals($report_group_row['job_time']);
            $job_up_time  = ($job_time < 2) ? 2 : $job_time;
            $job_rate     = $report_group_row['user_rate'];
            $job_total    = $job_time * $job_rate;
            $job_up_total = $job_up_time * $job_rate;
            $user_total_fee += $job_total;
            $user_date_fee += $job_total;
            $user_total_up_fee += $job_up_total;
            $user_date_up_fee += $job_up_total;
            $user_total_time += $job_time;
            $date_total_time += $job_time;
            $date_total_up_time += $job_up_time;
            $user_total_up_time += $job_up_time;
            $rowdata .= "<tr>
                        <td>" . $report_group_row['job_num'] . "</td>
                        <td>" . $job_date . "</td>
                        <td>" . $job_start . "</td>
                        <td>" . $job_end . "</td>
                        <td>" . number_format($job_time, 2, '.', '') . "</td>
                        <td>" . cash($job_total) . "</td>
                        <td>" . ($job_time < 2 ? number_format($job_up_time, 2, '.', '') : number_format($job_up_time, 2, '.', '')) . "</td>
                        <td>" . ($job_time < 2 ? cash($job_up_total) : cash($job_up_total)) . "</td>
                    </tr>";
            $records++;
        }
        $rowdata .= "<tr>
                        <td colspan=5>Date total</td>
                        <td>" . number_format($date_total_time, 2, '.', '') . "</td>
                        <td>" . cash($user_date_fee) . "</td>
                        <td>" . number_format($date_total_up_time, 2, '.', '') . "</td>
                        <td>" . cash($user_date_up_fee) . "</td>
                    </tr>";
        }
    }
?>
    <h4>Job report for <?php echo $user_name; ?></h4>
    <table>
        <thead>
            <tr>
                <th>#</th>
                <th>Job#</th>
                <th>Job Date</th>
                <th>Start</th>
                <th>End</th>
                <th>Time</th>
                <th>Total</th>
                <th>Up-time</th>
                <th>Total Up</th>
            </tr>
        </thead>
        <tbody>
<?php
        echo $rowdata;
?>
        </tbody>
        <tfoot>
            <tr>
                <td colspan=5>Total for <?php echo $user_name; ?></td>
                <td><?php echo number_format($user_total_time, 2, '.', ''); ?></td>
                <td><?php echo cash($user_total_fee); ?></td>
                <td><?php echo number_format($user_total_up_time, 2, '.', ''); ?></td>
                <td><?php echo cash($user_total_up_fee); ?></td>
            </tr>
        </tfoot>
    </table>

呼び出される主な関数は次のとおりです。

public function get_dates($start, $end) {
    $query = $this->db->prepare("SELECT DISTINCT job_date 
                                   FROM jobs 
                                  WHERE job_date BETWEEN ? AND ? 
                                    AND entry = 1 
                               ORDER BY job_date ASC");
    $query->bindValue(1, $start);
    $query->bindValue(2, $end);
    try {
        $query->execute();
    } catch (PDOException $e) { die($e->getMessage()); }
    return $query->fetchAll();
}

public function get_jobs($user, $date) {
    $query = $this->db->prepare("SELECT job_num, 
                                        job_date, 
                                        job_start, 
                                        job_end, 
                                        TIMEDIFF(job_end, job_start) AS job_time,
                                        users.first_name             AS user_name, 
                                        users.last_name              AS user_last, 
                                        users.rate                   AS user_rate 
                                   FROM jobs 
                              LEFT JOIN users 
                                     ON jobs.user_id = users.id
                                  WHERE job_date = ? 
                                    AND user_id = ?
                                    AND entry = 1
                               ORDER BY job_date ASC, job_start ASC");
    $query->bindValue(1, $date);
    $query->bindValue(2, $user);
    try {
        $query->execute();
    } catch (PDOException $e) { die($e->getMessage()); }
    return $query->fetchAll();
}

このコードは現在、希望どおりに機能し、必要な方法でデータを適切に表示します。

私の質問: 必要なデータを表示するために 2 つの異なるクエリを作成する必要がないように、これをコーディングするより効率的な方法はありますか?

ありがとうございました!

4

0 に答える 0