0

我有以下格式的 3 个表格。

  • 用户

ID

  • 用户工作

ID

工作信息

  • 已加星标的职位

ID

用户身份

userjob_id

评论

结束日期

'starredjobs' 表包含用户加星标/添加到收藏夹的所有工作。我在各自的模型文件中定义了以下关系。

  • 用户.php

protected $_has_many = array('starredjobs' => array('model' => 'starredjobs' , 'foreign_key'=>'user_id'),

  • 已加星标的job.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'));

  • 用户作业.php

    没有任何

这个想法是从用户对象中检索所有加星标的作业和有关作业的详细信息。一个用户可以有“n”个工作,一个工作可以由“n”个用户加星标。

我是否正确定义了关系?

4

1 回答 1

3

简短的回答:不。你在这里拥有的是一个典型的n:m关系,可以很容易地在 Kohana 中使用has_many “通过”(在默认角色用户关系中使用)。但这不允许“中间”表中的额外属性,因此您需要使用 2 has_many和相应的belongs_to

这可以用简单的英语来描述,如下所示:

  • user有多starredjobs
  • job有多starredjobs
  • 一个starredjob属于一个user和一个job

far_key还要考虑和之间的区别foreign_key(遗憾的是官方文档没有涵盖它),但要记住一个简单的规则:另一个表中的键很远 -> 它是far_key.

这会给你以下

用户.php

$_has_many = array(
    'starredjobs' => array(
        'model' => 'Starredjob',
        'far_key' => 'user_id'
    )
);

用户作业.php

$_has_many = array(
    'starredbyuser' => array(
        'model' => 'Starredjob',
        'far_key' => 'userjob_id'
    )
);

已加星标的job.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.
}
于 2014-07-01T02:06:29.430 回答