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 特定的)的主要内容,如果未能解决你的问题,请参考以下文章