CakePHP - 数据库结构和模型

时间:2012-07-25 14:43:06

标签: php cakephp

我正在构建我的第一个简单的应用程序,但由于我是网络开发的新手,我对如何正确组织我的数据库结构(和模型)有一些疑问。

我的一个页面是演员电影,所以我需要显示:

年,导演,描述等。我还需要展示一些与当前电影相关的图片。

据我所知,我需要在我的数据库中制作2个表。 第一个带有ID和所有其他字段(年份,导演,描述)。第二个表带有胶片ID和一些图像文件名字段。这是一种正确的方式吗?

但我不明白如何将这些表链接在一起以及从这两个表中检索我的数据并将其发送到View时。我读了一本食谱但对新手来说并不简单。

有人可以提供一个与我的要求有关的例子吗?

2 个答案:

答案 0 :(得分:3)

男人,搜索并了解实体关系模型。这个问题与PHP或CakePHP无关。

回答您的问题,您可以根据您想要实现的目标来表示您的数据

1。演员有很多照片

正如你所说,可能有两个表:每个表都有一个唯一的id,也称为主键(PK)。并且第二个表具有“一对多”关系(或1:n),该表还具有与第一个表相关的外键(FK)。例如,id = 4的actor可以有四张图片(id = 1,2,5,9),但所有这些图片都带有外键(actor_id = 4)

结构如下所示:

Actors                        Pictures
----------------              -------------------
id (PK)                       id (PK)
name                          actor_id (FK)
address                       file_name
birth_date
...                    

通过此设置,您可以获得与演员相关的图片。但是你谈到了电影,所以你可能需要第二种选择。

2。演员有很多电影,这些电影有很多照片

在中间添加另一个表格,例如“电影”,您可以将图片与此表相关联。

所以你会有例如同一个id = 4的演员和两部电影(id = 2,6)与演员(actor_id = 4)的关系相同,第一部电影有两张图片(id = 1) ,2 film_id = 2)和第二部电影有四张图片(id = 3,4,5,6 film_id = 6)

Actors                        Films                         Pictures
----------------              -------------------           -------------------
id (PK)                       id (PK)                       id (PK)
name                          actor_id (FK)                 film_id (FK)
address                       name                          file_name
birth_date                    year
...

对你有帮助吗?

答案 1 :(得分:3)

你认为你需要2张桌子是正确的。要获得最简单的配置,请遵循Cake的约定。表格是复数。我们还会使用自动更新的createdmodified字段。您的表格看起来像这样(根据需要添加额外的列):

<强>演员

id
year
director
description
created # automatically filled in by cake
modified # automatically filled in by cake

图片

id
actor_id
path
created
modified

现在,更新模型以反映关系。你在这里有Actor hasMany Image,而Image areTo Actor。

<强> /app/Model/Actor.php

<?php
class Actor extends AppModel {
  public $hasMany = array('Image');
}

<强> /app/Model/Image.php

<?php
class Image extends AppModel {
  public $belongsTo = array('Actor');
}

由于我们使用了Cake的约定,它会自动知道表,外键,并在执行find()时拉出关系。

我们会为您的演员制作快速索引动作。

<强> /app/Controller/ActorsController.php

<?php
App::uses('AppController', 'Controller');
class ActorsController extends AppController {
  public function index() {
    // get all actors and their images
    $this->Actor->recursive = 1;
    $actors = $this->Actor->find('all');
    // send to view as a variable named '$actors'
    $this->set('actors', $actors);
  }
}

在您的视图中,迭代演员并显示您喜欢的信息!这是一个非常简单的视图示例,显示了演员姓名和表格中的第一张图片。

<强> /app/View/Actors/index.ctp

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Image</th>
    </tr>
  </thead>
  <tbody>
<?php
foreach ($actors as $actor) {
  $name = $this->Html->tag('td', $actor['Actor']['name']);
  // show first image
  $img = $this->Html->image($actor['Image'][0]['path']);
  $image = $this->Html->tag('td', $img);
  echo $this->Html->tag('tr', $name.$image);
}
?>
  </tbody>
</table>

99%的工作可以通过使用Cake的bake shell来完成。它将为您生成模型,控制器和视图。然后你可以随意进入并自定义它们。我真的建议你去烘烤,因为它会让你的生活更轻松,甚至可以为你提供最佳实践提示。