无需在数据库中设置就可以在 Yii 中修复外键吗?

Posted

技术标签:

【中文标题】无需在数据库中设置就可以在 Yii 中修复外键吗?【英文标题】:Possible to Fix a Foreign Key in Yii without having set it up in the Database? 【发布时间】:2011-06-24 20:56:49 【问题描述】:

我正在为我的数据库 GUI 使用 phpMyAdmin,它正在连接到我网站上的 Yii 框架。

例如,我希望我的products 表有一个外键department_id,它是对我的departments 表的id 字段的引用。不幸的是,我目前无法在 phpMyAdmin 中正确设置外键,因此 department_id 只是一个索引字段。我目前无法更改 phpMyAdmin 的配置,所以它就像没有外键和关系工具一样卡住了。

有没有办法在 Yii 中修改这些表的模型以便它们链接?我知道模型类文件中有一个relations 函数,其中包含此信息:

return array('department_id' => array(self::BELONGS_TO, 'Departments', 'id'),

我不能只添加类似于上面的内容吗?还有更多的跑腿吗?由于 phpMyAdmin,它现在是否已修复(如静态,未更正)?

干杯

【问题讨论】:

【参考方案1】:

如果我没记错的话,你不需要 mysql 强制执行外键关系以便它们在 Yii 中仍然工作。在 mySql 中设置 FK 约束可确保正确的数据库完整性,但我认为 Yii 实际上并没有在运行时使用它。

最初运行 yiic (of Gii) 来构建项目时,我认为它着眼于 DB 以在模型中构建正确的关系,但之后不再使用它们。

Yii 然后使用表关系的这些知识(来自 yiic)通过提供访问关系数据的快捷方法来使您的生活更轻松,并确保您不会违反 mySql 约束并出现丑陋的 SQL 错误等。但是您仍然可以在没有底层 SQL 约束的情况下使用 Yii 关系逻辑。 唯一的问题是,如果 Yii 搞砸了并分配了一个不存在的 FK 或其他东西,您的数据库将不会捕获此错误(您的数据完整性将更容易出错)。

要将您的产品链接到部门,只需确保您在产品中有一个 department_id 字段(听起来像您这样做)。然后像这样向 Product 添加一个关系规则:

'department' => array(self::BELONGS_TO, 'Department', 'department_id'),

在你的部门模型中:

'products' => array(self::HAS_MANY, 'Product', 'department_id'),

现在你应该可以正常使用关系了:

$myProductModel->department; // returns the model of the Department referenced
$myDepartmentModel->products; // returns the models of all Products in the department

祝你好运,如果我离基地很远并且对你不起作用,请告诉我!

【讨论】:

+1。这个答案是完全正确的。 Yii 不需要数据库本身具有 FK 关系,它确实需要知道它们(通过关系()函数),尽管它们是否存在。我们有一个非常大的项目在 Yii 中运行,在 DB 中没有实际关系。我们刚刚在 Yii 本身中设置了所有验证和关系,以便更轻松地处理代码中的关系错误。 -- 编辑:由于数据完整性是通过验证完成的,因此请确保将其设置得非常好。 如果你需要通过非主键加入你的关系,你就有麻烦了。在需要加入合同和目录的集成环境中遇到此问题。该关系不是 Contract.ID = Catalogue.ContractId,而是通过 Contract.SomeOtherId = Catalogue.ContractdId。 Yii 无法处理这种情况,除非有 FK(如果有 FK,它会在运行时使用该关系)。

以上是关于无需在数据库中设置就可以在 Yii 中修复外键吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在我的大多数表中使用我的外键作为我的主键吗?

可以使用实体框架在另一个表中调用两次作为外键的主键吗?

Oracle一个字段的的外键可以当另一个字段的主键吗

我应该使用外键吗? [复制]

当主键在不同的表中时,可以引用两个外键吗?

一张桌子有两个外键吗?