用CakePHP定义关系

用CakePHP定义关系,cakephp,datamodel,Cakephp,Datamodel,我在CakePHP中定义关系时遇到问题。我有以下数据模型: +--------------+ | Course | +--------------+ | other fields | | T_id |---+ | A_id |-+ | +--------------+ +--------------+ | | | Item | | | +-------------

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

 +--------------+
 |  Course      |
 +--------------+
 | other fields |
 | T_id         |---+
 | A_id         |-+ |     +--------------+
 +--------------+ | |     | Item         |
                  | |     +--------------+
 +--------------+ +-------| id           |
 |  Paragraph   | | |     | other fields |
 +--------------+ | |     +--------------+
 | other fields | | |
 | T_id         |-+ |
 | A_id         |---+
 +--------------+
其中有两个表与另一个表有关系。 此外:课程和段落的每一部分都有两个项目。我想我会将T-id和A_id定义为hasOne with Item,但CakePHP似乎不同意这一点:- hasOne觉得语义正确,但是。。。它不工作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;
问候,


保罗

我会尝试做如下的事情

项目模型

课程模式

段落模式

这并没有严格遵循您的数据库表布局,我个人觉得有更多描述性字段比有一个\u id要好,有一个\u a\u id足够描述性地向另一个开发人员显示这个字段链接到一个项目记录


这要求课程表和段落表的字段item_a_id和item_b_id设置为INT/MEDIUMINT等。

生成代码或尝试从蛋糕烘焙控制台生成我正在尝试使用烘焙控制台生成代码,但是我的模型不正确。您是否使用INNODB Engine在PHP-my-ADMIN中创建,使用纯SQL创建;将SQL添加到问题中感谢您详细的回答。我之所以没有这样做,是因为感觉不对:项目属于课程,而不是相反。我认为它会/应该像我试图做的那样起作用。我永远不会从上面的项目中找出它们属于哪一个过程,所以这篇文章定义了4种关系,而在我看来,数据模型是不存在的。你能描述一下你的推理吗?我知道我问了一个很难的问题,但我只是想真正理解你在做什么:-看来我误解了原来的问题,我道歉。我将很快更新我的答案,以反映这一问题。我的印象是,课程将有两个不同的项目与一个记录相关联,段落将有两个不同的项目与一个记录相关联。嗯,情况就是这样。每门课程需要两个项目,每一章也需要。问题是,我不认为项目需要意识到它们与课程或段落的关系。甚至可能有更多的对象需要项目,因此我认为项目尽可能简单。因此,您提到项目属于课程,而不是相反的方式。为了实现这一点,您需要项目具有课程id或课程id,以便表始终具有外键字段。在我上面的例子中,如果你做了$this->Course->find'first',array'contain'=>'ItemA',ItemB';您将得到如下结果:[Course]=>array。。数据[ItemA]=>数组。。来自课程[item_a_id][ItemB]=>数组的数据。。来自课程[item_b_id]的数据我对你现在想要什么有点困惑,但也许这毕竟是对的?谢谢你的耐心!:-我试图实现的是多个课程和并列图,但是会有更多的模型将两个项目链接到它们。从模型课程等,我希望能够检索属于他们的项目。我不希望看到的是,如果没有其他方法,那么当然,对于每个需要一个项的表,Item将包含不同的字段。我认为这会导致开销和许多字段未被使用。
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'
        )
    );
}