ORM 关系(可能是 Kohana 特定的)

Posted

技术标签:

【中文标题】ORM 关系(可能是 Kohana 特定的)【英文标题】:ORM relationships (possibly Kohana specific) 【发布时间】:2013-05-05 19:53:30 【问题描述】:

我有几个模型,一个是通知,一个是严重性。通知具有严重性。

我的数据库中的 Notifications 表(简化)如下

id => int
message => text
severity_id => int

我的严重性表有以下列

id => int
name => varchar(20)

在我的通知模型中,我有以下关系

protected $_has_one = array(
    'severity' => array(
        'model' => 'NotificationSeverity',
        'foreign_key' => 'id' )
);

我不知道如何告诉它使用severity_id 作为关系的这一边。

我希望能够直接从通知对象访问严重性,即 $notification->severity->name 等。

我还尝试在该关系的另一端设置一个 has_many 关系,如下所示,以便我可以访问具有特定优先级的所有通知的列表。

protected $_has_many = array(
    'notifications' => array( 'model'  =>  'Notification', 
    'foreign_key' => 'severity_id' )
);

我做错了什么?

编辑:如果需要,我可以更改数据库和/或代码。

【问题讨论】:

【参考方案1】:

您需要在关系的两边使用相同的foreign_key。另外has_many需要对应的部分是belongs_to

has_many 意味着“拥有”,就像 has_one 一样,而 belongs_to 意味着“被拥有”。因此,您不能让一个站点拥有另一个站点,但另一个站点也拥有一个站点(除非您有 has_many_through)。这意味着当一侧有_one/has_many模型时,对应的一侧需要属于(s)_to。

通知

$_belongs_to = array(
    'severity' => array(
        'model' => 'NotificationSeverity',
        'foreign_key' => 'severity_id',
    )
);

通知严重性

$_has_many = array(
    'notifications' => array(
        'model' => 'Notification',
        'foreign_key' => 'severity_id',
    )
);

【讨论】:

为什么属于而不是拥有一个?当通知不属于严重性时,拥有属于关系是没有意义的。 通知在其表中保存了severity_id,所以它确实属于它,不是吗? 通知有严重性,这是我眼中唯一的关系。严重性不应该真正了解通知。 您的方法确实有效,我只是想了解为什么我需要设置所有这些额外的关系,而我只想说通知具有一种严重性。 我觉得这里的语言有点棘手(我觉得我无法完全表达自己)。 belongs_to 表示密钥保存在该模型中,而has_one/has_many 希望密钥保存在相应模型中

以上是关于ORM 关系(可能是 Kohana 特定的)的主要内容,如果未能解决你的问题,请参考以下文章

Kohana 2.3.4 ORM - 删除数据透视表关系

Kohana-v3 ORM 父关系

Kohana3 ORM 需要澄清关系

如何在 Kohana 3 中链接多个 ORM 关系?

Kohana 3 ORM:如何使用 2 个多对多关系执行查询

模型中的 Kohana ORM 多重关系