0

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 相关的所有相关结果。

我的代码:

(报告控制器.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>

有任何想法吗?

4

1 回答 1

0

你的问题不是很清楚,但在我看来,你想显示一个包含来自所有 3 个表的信息的视图。

在这种情况下,您将需要创建模型关联

考勤模型中:

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')
        )
    );
}

控制器中,您可以添加一个 find('all') 查询,该查询将从出勤中检索所有行,以及它们对应的 Staff 和 Course 行。

$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>

要仅显示员工的名称一次,您可以在视图中添加一个变量,并在每次找到新的员工行时重置它。如果对 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”字段。

于 2012-11-25T21:26:40.937 回答