在CakePHP中定义关系

时间:2014-03-12 10:19:13

标签: cakephp datamodel

我在CakePHP中定义关系时遇到了麻烦。我有以下数据模型:

 +--------------+
 |  Course      |
 +--------------+
 | other fields |
 | T_id         |---+
 | A_id         |-+ |     +--------------+
 +--------------+ | |     | Item         |
                  | |     +--------------+
 +--------------+ +-------| id           |
 |  Paragraph   | | |     | other fields |
 +--------------+ | |     +--------------+
 | other fields | | |
 | T_id         |-+ |
 | A_id         |---+
 +--------------+

有2个表与另一个表有关系。 此外:课程和段落中的每一个都有两个"项目"。我以为我会将T-id和A_id定义为带有Item的hasOne,但CakePHP似乎并不同意这一点:-) hasOne感觉semantiaclly正确,但...它不起作用(CRUD生成的代码没有给我一个下拉选项。它确实创建一个下拉列表,但是它是空的。

如何定义模型,以便CakePHP理解每个表中的两个关键字段都指向一个项目? (因此,如果有1章和1段,总共会有4条记录。)

目前,我有这个:

'AItem' => array(
  'className' => 'Item',
  'foreignKey' => 'id',
  'conditions' => array('a_item_id = Item.id'),
  'fields' => '',
  'order' => ''
)

用于生成课程表的SQL:

CREATE TABLE IF NOT EXISTS `courses` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `a_item_id` bigint(20) DEFAULT NULL,
  `t_item_id` bigint(20) DEFAULT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  foreign key (a_item_id) references items(id) on delete cascade,
  foreign key (t_item_id) references items(id) on delete cascade
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

的问候,

1 个答案:

答案 0 :(得分:0)

我会尝试做类似以下的事情

项目模型

class Item extends AppModel {

    public $hasOne = array(
        'CourseA' => array(
            'className' => 'Course',
            'foreignKey' => 'item_a_id',
            'type' => 'INNER'
        ),
        'CourseB' => array(
            'className' => 'Course',
            'foreignKey' => 'item_b_id',
            'type' => 'INNER'
        ),
        'ParagraphA' => array(
            'className' => 'Paragraph',
            'foreignKey' => 'item_a_id',
            'type' => 'INNER'
        ),
        'ParagraphB' => array(
            'className' => 'Paragraph',
            'foreignKey' => 'item_b_id',
            'type' => 'INNER'
        )
    );
}

课程模型

class Course extends AppModel {

    public $belongsTo = array(
        'ItemA' => array(
            'className' => 'Item',
            'foreignKey' => 'item_a_id',
            'type' => 'INNER'
        ),
        'ItemB' => array(
            'className' => 'Item',
            'foreignKey' => 'item_b_id',
            'type' => 'INNER'
        )
    );
}

段落模型

class Paragraph extends AppModel {

    public $belongsTo = array(
        'ItemA' => array(
            'className' => 'Item',
            'foreignKey' => 'item_a_id',
            'type' => 'INNER'
        ),
        'ItemB' => array(
            'className' => 'Item',
            'foreignKey' => 'item_b_id',
            'type' => 'INNER'
        )
    );
}

这并不严格遵循您的数据库表格布局,我个人觉得有更多的描述性字段比a_id更好,因为item_a_id的描述性足以显示另一个开发者,该字段链接到项目记录。

这要求Course和Paragraph表将字段“item_a_id”和“item_b_id”设置为INT / MEDIUMINT等。