【问题标题】:Defining relation in CakePHP在 CakePHP 中定义关系
【发布时间】:2014-04-16 09:35:37
【问题描述】:

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

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

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

如何定义模型,让CakePHP 理解每个表中的这两个关键字段都指向一个Item? (因此,如果有 1 章和 1 段,则 Item 中总共将有 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;

问候,

保罗

【问题讨论】:

  • 自己生成代码或尝试从 Cake-Bake-Console 生成代码
  • 我正在尝试使用 bake-console 生成它,但显然我的模型不正确。
  • 你是在 PHP-MY-ADMIN 中使用 INNODB-Engine 创建的吗
  • 使用纯 SQL 创建;将 SQL 添加到问题中

标签: cakephp datamodel


【解决方案1】:

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

物品模型

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 等。

【讨论】:

  • 感谢您的详尽回答。我没有这样做的原因是它“感觉”了错误的方式:项目“属于”课程,而不是相反。而且我认为它会/应该在我尝试这样做时起作用。而且我永远不会从“向上”的项目中尝试找到它们属于哪个课程,所以这种方法定义了 4 个在我看来数据模型不存在的关系。你能描述你的推理吗? (我知道我在这个问题上提出了一个难题,但只是想真正理解你在做什么:-))
  • 看来我误解了原来的问题,我很抱歉。我将很快更新我的答案以反映这个问题。我的印象是 Course 会有两个不同的项目关联到一个记录,而 Paragraph 会有两个不同的项目关联到一个记录。
  • 嗯,就是这样。每门课程都需要两个项目,每一章也需要。问题是我不认为项目需要“了解”它们可能与课程或段落之间的关系。 (可能还有更多需要物品的对象,所以我希望物品尽可能简单
  • 您还提到该项目属于课程而不是相反,对于蛋糕 ORM,您需要项目具有 course_id 或 course_a_id(belongsTo 表始终具有外键场地)。对于我上面的例子,如果你做了 $this->Course->find('first', array('contain' => 'ItemA', 'ItemB'));您将得到如下结果: [Course] => array( .. data ) [ItemA] => array( .. data from Course[item_a_id] ) [ItemB] => array( .. data from Course[item_b_id] )我对你现在想要什么有点困惑,但也许这毕竟是对的?
  • 感谢您的耐心等待! :-) 我想要实现的是多个(课程和段落,但会有更多)模型有两个项目链接到它们。从模型课程等我希望能够检索属于他们的项目。我不希望(但如果没有其他方法,那么当然会是那样)是 Item 为需要 Item 的每个表包含不同的字段。我认为这会导致开销和许多字段未被使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多