CakePHP - 在列出的记录中显示另一个列表记录

时间:2012-11-25 13:39:49

标签: php cakephp html-table record

How我们可以使用CakePHP display列出记录中的另一个列表记录inside吗?

我有3张桌子:(工作人员,课程,出勤)

(职员)

staff_id    |   name    |   passport
------------------------------------------------
1       |   A   |   123
2       |   B   |   132
3       |   C   |   321

(课程)

c_id    |   name
----------------------
10  |   PHP
20  |   AJAX
30  |   XHTML

(出席)

at_id   |   staff_id    |   course_id
------------------------------------------------
1   |   1       |   10
2   |   1       |   20
3   |   1       |   30
4   |   2       |   20
5   |   2       |   30

我想生成一些报告,显示我们的员工参加的课程,如下所示:

Name    |   Course Attend
------------------------------
A   |   PHP
    |   AJAX
    |   XHTML
B   |   AJAX
    |   XHTML

在这里,我使用表格工作人员显示结果,我应该怎么做才能在我的列Course Attend中获取与考勤表相关的其他获取结果,该表将列出所有相关结果给员工ID。

我的代码:

(ReportController.php)

$view = $this->Staff->find('all');

$this->set('view', $view);

(查看 - report.ctp)

<table>
<?php foreach($view as $data): ?>
<td>
    <?php echo $data['Staff']['name']; ?>
</td>
<td>
    <?php // something to do here... ?>
</td>
<?php endforeach ?>
</table>

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

从您的问题中不太清楚,但在我看来,您希望显示包含所有3个表格中信息的视图。

在这种情况下,您需要创建Model associations

出勤模式中

class Attendance extends AppModel {
    public $hasOne = array(
        'Staff' => array(
            'className'  => 'Staff',
            'foreignKey' => false,
            'conditions' => array('Staff.staff_id = Attendance.staff_id')
        ),
        'Course' => array(
            'className'  => 'Course',
            'foreignKey' => false,
            'conditions' => array('Course.c_id = Attendance.course_id')
        )
    );
}

控制器中,您可以添加一个查找('全部')查询,该查询将从出勤中检索所有行,以及相应的人员和课程行。

$attendance_rows = $this->Attendance->find('all', array('order' => 'Staff.name ASC, Staff.staff_id ASC'));
$this->set("attendance_rows", $attendance_rows);

视图中,您可以照常使用foreach循环:

<table>
<?php foreach($attendance_rows as $data): ?>
<td>
    <?php echo $data['Staff']['name']; ?>
</td>
<td>
    <?php echo $data['Course']['name']; ?>
</td>
<?php endforeach ?>
</table>

要仅显示一次Staff的名称,您可以在视图中添加变量,并在每次找到新的Staff行时重置该变量。如果查找了find('all')查询,则此方法有效。

<table>
<?php $temp = null; $no = 1;?>
<?php foreach($attendance_rows as $data): ?>
<td>
    <?php if ($temp != $data['Staff']['staff_id']) { echo $no; $no++;} ?>
</td>
<td>
    <?php if ($temp != $data['Staff']['staff_id']) { echo $data['Staff']['name']; $temp = $data['Staff']['staff_id']}; ?>
</td>
<td>
    <?php echo $data['Course']['name']; ?>
</td>
<?php endforeach ?>
</table>

还有一个建议:您应该始终将主键命名为“id”,而不是“staff_id”或“c_id”,因为Cakephp知道如何根据名称绑定模型。如果您创建模型'Cakephp方式',则在创建关联时不需要指定'foreignKey'或'conditions'字段。