一个控制器的两种型号

时间:2011-03-19 18:48:09

标签: model-view-controller

假设我有一个YouTube风格的网站,但有图片而不是视频。每个用户可以一次上传多个图像。我想将图像存储在一个表中,并且我想将关于显示图像的页面的信息(图像的“辩论”页面)存储在另一个表中 - 这个有一个列我存储的外来ID在数据库中上传和引用的图像。

我应该创建两个模型并从同一个控制器中调用它们吗?

例如,我可以createDebateController创建两个模型 - 一个用于存储辩论页面信息,另一个用于存储图像。这会合理吗?如果是,我如何将每个图像的id存储在数据库中创建辩论页面信息的模型中?

2 个答案:

答案 0 :(得分:0)

我会为每个创建一个模型,然后只通过其相关的图像对象引用辩论对象。因此,在发布新图片时:

$image = new Image();
$image->setImage($file);
$image->setName($name);
$image->save();

然后,每当发布评论时,您都会使用图像对象间接创建辩论对象:

$image->addDebate($user, $timestamp, $comment);

或在渲染显示页面时:

foreach ($image->getDebates() as $debate) {
    $debate->print();
}

您的图像对象将直接访问辩论对象:

class Image
{

    public function addDebate($user, $timestamp, $comment)
    {
        $debate = new Debate();
        $debate->setImageId($this->id);
        $debate->setUser($user);
        $debate->setTimestamp($timestamp);
        $debate->setComment($comment);
        $debate->save();
    }

    public function getDebates()
    {
        return query("select * from debate where image_id = ?", $this->id);
    }

}

答案 1 :(得分:0)

我认为你可能会使用两个独立的控制器。一个用于辩论,一个用于图像。您的辩论模型(假设一对多关系)应该有一组图像ID,或者如果您需要每个图像的放置或其他识别信息,可能还有一组图像描述符。如果您不需要放置信息,只需使用图像ID即可使用图像控制器生成指向每个图像的链接集合。如果确实需要放置(或描述等信息),则描述模型具有实际的图像ID。是的,可以在模型中显示与视图相关的关系。