我是CakePHP和MVC开发的新手,并试图用cakePHP创建一些东西,但无法弄清楚如何做到这一点:
我正在创建一个简单的CRUD应用程序,它通过简单的数据输入表单接收专辑和歌曲。我创建了数据库并使用了Cake控制台应用程序来创建所有模型/控制器等,它运行良好。我可以CRUD两个专辑和歌曲没问题,并且DB中的歌曲表连接到具有外键的专辑表,因此模型中存在所有链接和关联。
我想要做的是能够点击相册并查看与该相册相关的歌曲,但我不知道如何去做。我是否需要在模型中添加查询,或者该功能是否会进入Controller?
我的看法是:在专辑列表中制作专辑名称链接,调用| viewAlbum |使用albumID在歌曲控制器中起作用。不知道从哪里开始虽然......
有人能指出我正确的方向吗?
干杯, 科尔姆
@JohnP谢谢你的回复。如何在控制器中创建一个调用该函数的链接呢?我有:
echo $html->link(__($album['Album']['title'], true),
array('controller'=>'Songs',
'action'=>'viewAlbum',
$album['Album']['id']));
其中viewAlbum是歌曲控制器中函数的名称。关于为什么这不起作用的任何想法?
答案 0 :(得分:0)
Cake的原生ORM已经为您做到了这一点。如果您实际进入相册的视图页面,它应该会显示您自己的所有相关歌曲。仅当您正确设置了关系时,此方法才有效。
如果您想自己编写此行为,可以在AlbumController中添加viewSongs
操作。此方法将查看传递给它的相册ID,并在Song模型中调用方法(例如getSongsByAlbum($aid)
)。在你的歌曲模型里面的那个方法将是一个类似于
$opts = array(
'conditions' => array(
'album_id' => $aid
)
);
return $this->find('all', $opts);
答案 1 :(得分:0)
Protos -
如果我理解正确 - 您正在使用John的示例,并且您需要修复视图中调用其控制器的链接?
<?
echo $this->Html->link(__($album['Album']['title'], true), array('controller'=>'Album', 'action'=>'viewSongs', $id));
?>
John的示例解释了如何在专辑控制器中创建方法,建议点击歌曲模型中返回所需结果的方法。
因此,您的链接将定位到相册控制器,其操作应该是控制器方法。
此方法在歌曲控制器中不太有意义,因为它需要专辑ID 。您只需要Album控制器从Songs模型/表中提取关联数据。约翰的答案是完全正确的,但如果你刚开始使用Cake,可能会太复杂。 John通过在歌曲模型中添加一个方法来分割所需的功能,该方法由专辑控制器中的方法调用,该方法为您的视图提供结果以显示。
我将其切换为“胖控制器”,这对于短代码更容易理解,但MVC更少。
你需要从专辑到歌曲之间的hasMany关系 - 每个专辑都有很多歌曲:
// ../models/album.php
class Album extends AppModel {
var $name = 'Album';
var $hasMany = array(
'Song' => array(
'className' => 'Song',
'foreignKey' => 'album_id'
)
);
您的控制器操作将如下所示:
// ../controllers/albums_controller.php
function viewSongs($id = null) {
if(isset($id) && $id != null) {
$albums = $this->Album->find('first',
array('conditions'=>array('Album.id'=>$id));
$songs = $this->Album->Song->find('all',
array('conditions'=>array('Song.album_id'=>$id)));
// This returns variables to the view to use
$this->set(compact('albums', 'songs'));
}
}
您的视图将被称为viewSongs.ctp,它看起来像这样:
// ../views/albums/viewSongs.ctp
<?php
foreach($albums as $album) {
echo "<h2>{$album['name']}</h2>";
echo "<ul>";
foreach ($songs as $song) {
echo "<li>{$song['Song']['name']}</li>"
}
echo "</ul>";
}
您在../views/albums/view.ctp中的链接就像是:
<?php
echo $this->Html->link('View Songs', array('controller'=>'albums',
'action'=>'viewSongs', $id));
?>