在CakePHP中提交对象的表单数据时,在表之间添加一对多关系的正确方法是什么?

时间:2013-11-28 12:48:31

标签: php mysql cakephp cakephp-appmodel

我有以下简化的架构:

CREATE TABLE IF NOT EXISTS `photos` (
  `id` varchar(20) NOT NULL,
  `title` varchar(200) NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `photo_id` varchar(20) NOT NULL,
  `category` enum('lasers','dinosaurs','space') NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

照片可以没有,一个或多个与之相关的类别。

在表单中,类别由复选框表示,因为此输入类型与“无,一个或多个”选择的模型匹配。

以下是我的问题:

  1. 使用CakePHP FormHelper,他有办法显示每个枚举值的复选框吗?

  2. 框架是否可以处理所有这些数据,并在提交表单时在save()saveAll()调用中正确插入到两个表中?或者我将不得不做一些预处理/自定义脚本编写?

  3. 是否可以集成这些关系,以便对它们进行排序/分页/等。何时获取数据。例如。我能够对属于“激光”类别的照片进行排序/过滤吗?

  4. 我是否走在正确的轨道上?

1 个答案:

答案 0 :(得分:1)

  1. CakePHP不支持本机枚举,因此您需要手动获取它们。然后,您可以使用Form helper,如下所示(未经测试):

    echo $this->Form->input('Category.id', array(
        'type' => 'select',
        'multiple' => 'checkbox',
        'options' => $categories, // id => name array
    ));
    
  2. 建议使用saveAssociated(),它会在保存时自动将photo_id添加到类别中。

  3. 您可以通过添加分页条件进行过滤,但排序更复杂,因为照片可以有多个类别。

  4. 除非您确定类别不会改变,否则最好使用Has And Belongs To Many关系。