cakephp:如何在视图中呈现相关模型

时间:2011-02-20 22:20:02

标签: cakephp model recursive-query

我的目标是在视图中显示相关子模型的记录(一旦删除)。我的问题是当我尝试输出以下查询时收到'Notice(8):Undefined index:'错误消息。

锦标赛有很多锦标赛详情,锦标赛详情有很多更新。我正在尝试显示锦标赛视图中显示的每个锦标赛详情的所有更新。

所以我的问题是如何正确解决错误消息并在锦标赛视图页面上显示每个锦标赛详情的更新。

我在“锦标赛”控制器视图操作中的查找数据是:

$updates = $this->Tournament->TournamentDetail->Update->find('all', array( 'tournament_details.tournament_id'=> $this->data['Tournament']['id']));

在视图中,我有这段代码。

<?php foreach ($tournament['Update'] as $update): ?>
 <h3>Updates</h3>
 <h1><?php echo $update ['title']; ?></h1>
 <p><?php echo $update ['body']; ?></p>
 <hr/>
<?php endforeach; ?>

这与我用于其他相关子记录的“foreach”代码相同,没有问题。我确实使用了debug()函数进行调查,但没有看到我遗漏的内容。

调试函数的$ updates数组的输出如下所示:

Array
(
    [0] => Array
        (
            [Update] => Array
            (
                [id] => 1
                [title] => first round matches start today
                [date] => 2010-03-19
                [body] => this tournament's first round matches start today.
                [tournament_detail_id] => 4
                [homeStatus] => no
            )

是否有一种特殊的方式来显示这些记录?

一如既往,提前谢谢。 保罗


更新:2011年2月23日 经过一些测试我似乎遇到的问题是找到并将正确的值传递给$ updates变量;

总结一下,我希望$ updates变量保存当前的'tournament_details_id'。然后,这将在“锦标赛”视图中显示相关的更新记录。

我还是初学者,很可能忽略了这一点。

以下是型号信息:

class Tournament extends AppModel {
 var $name = 'Tournament';
 var $hasMany = array(
    'TournamentDetail' => array(
    'className' => 'TournamentDetail',
'foreignKey' => 'tournament_id',)


class TournamentDetail extends AppModel {
var $name = 'TournamentDetail';
var $belongsTo = array(
    'Tournament' => array(
        'className' => 'Tournament',
        'foreignKey' => 'tournament_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

class Update extends AppModel {

var $name = 'Update';
var $belongsTo = array(
         'TournamentDetails' => array(
        'className' => 'TournamentDetails',
        'foreignKey' => 'tournament_detail_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

控制器数据:

class TournamentsController extends AppController 

function view($slug = null) {
    if (!$slug) {
        $this->Session->setFlash(__('Invalid Tournament.', true));
        $this->redirect(array('action'=>'index'));
    }
    $this->Tournament->recursive = 1;
    $tournament = $this->Tournament->findBySlug($slug);
    $updates = $this->Tournament->TournamentDetail->Update->find('all', array('conditions' => array( 'tournament_details_id' => $this->data['TournamentDetails']['id'] )));

$this->set(compact('tournament','updates', $updates ));

比赛视图。这将显示“锦标赛详情”和(理想情况下)相关锦标赛详情“更新”

<h2><?php echo $tournament['Tournament']['name']; ?></h2>

<?php foreach ($tournament['TournamentDetail'] as $tournamentDetail): ?>
 <h1><?php echo $tournamentDetail ['title']; ?></h1>
 <p><?php echo $tournamentDetail ['body']; ?></p>
<?php endforeach; ?>

<?php foreach ($updates['Update'] as $update): ?>
 <h4>Update: <?php echo $update  ['date']; ?></h4>
 <p> <?php echo $update ['Update'] ['title']; ?></p>
 <p><?php echo $update ['Update'] ['body']; ?></p>
<?php endforeach; ?>

我已经通过将比赛详情“id”添加为整数来测试这一点,它会提取正确的“更新”记录。但是,我似乎在配置查找操作时也遇到了问题。

我一如既往地感谢你的帮助。

由于 保罗

2 个答案:

答案 0 :(得分:1)

根据您的调试输出,您的$ tournaments变量似乎由一个数组(而不是关联数组)组成,因此您可能希望使用foreach来访问每个元素:

foreach ($tournaments as $update):
?>
    <h3>Updates</h3>
    <h1><?php echo $update ['Update']['title']; ?></h1>
    <p><?php echo $update ['Update']['body']; ?></p>
    <hr/>
<?php endforeach; ?>

答案 1 :(得分:0)

您似乎使用了错误的变量,您谈论的是$updates变量,但您在视图中使用了$tournament变量。

<?php foreach ($updates['Update'] as $update): ?>
 <h3>Updates</h3>
 <h1><?php echo $update ['title']; ?></h1>
 <p><?php echo $update ['body']; ?></p>
 <hr/>
<?php endforeach; ?>

此外,您尚未发布整个控制器方法,其中包括该查找,但您可能尚未将数据发送到视图

$this->set(compact('updates'));