我有以下格式的3个表格。
ID
姓
名字
ID
JOBINFO
ID
USER_ID
userjob_id
评论
结束日期
'starredjobs'表格包含用户加星标/添加到收藏夹的所有作业。 我在各自的模型文件中定义了以下关系。
protected $ _has_many = array('starredjobs'=> array('model'=>'starredjobs','foreign_key'=>'user_id'),
starredjob.php
protected $ _belongs_to = array('user'=> array('model'=>'user','foreign_key'=>'user_id'));
protected $ _has_many = array('jobs'=> array('model'=>'userjob','foreign_key'=>'job_id'));
userjobs.php
无
这个想法是从用户对象中检索所有已加星标的作业和有关作业的详细信息。用户可以'n'个工作,而工作可以由'n'个用户加星标。
我是否正确定义了关系?
答案 0 :(得分:3)
简短回答:不。你在这里有一个典型的n:m
关系,可以使用has_many "through"轻松地在Kohana中使用(在默认角色users-relationship中使用)。但这并不能在"中间"中提供额外的属性。表格,因此您需要使用2 has_many和相应的belongs_to。
这可以用简单的英语描述如下:
user
有很多starredjobs
。job
有很多starredjobs
。starredjob
属于一个user
和一个job
还要考虑far_key
和foreign_key
之间的区别(官方文档遗憾地没有涵盖它),但要记住一个简单的规则:另一个表中的键很远 - &gt ;它是far_key
。
这会给你以下
<强> user.php的强>
$_has_many = array(
'starredjobs' => array(
'model' => 'Starredjob',
'far_key' => 'user_id'
)
);
<强> userjob.php 强>
$_has_many = array(
'starredbyuser' => array(
'model' => 'Starredjob',
'far_key' => 'userjob_id'
)
);
<强> starredjob.php 强>
$_belongs_to = array(
'user' => array(
'model' => 'User',
'foreign_key' => 'user_id'
),
'job' => array(
'model' => 'Userjob',
'foreign_key' => 'userjob_id'
)
);
现在你可以做各种事情,例如:
//get all jobs starred by given $user
foreach ($user->starredjobs->find_all() as $starredjob) {
//info on userjob via $starredjob->job->jobinfo, etc.
//info from pivot table via $starredjob->comments, etc.
}
//get all users that starred a given $userjob
foreach ($userjob->starredbyuser->find_all() as $starredjob) {
//info on user via $starredjob->user->FirstName, etc.
//info from pivot table via $starredjob->comments, etc.
}