Kohana / PHP - 为“收藏夹”表定义ORM关系

时间:2014-06-30 15:49:38

标签: php kohana kohana-3.3

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

  • 用户

ID

名字

  • userjobs

ID

JOBINFO

  • starredjobs

ID

USER_ID

userjob_id

评论

结束日期

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

  • user.php的
  

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'个用户加星标。

我是否正确定义了关系?

1 个答案:

答案 0 :(得分:3)

简短回答:不。你在这里有一个典型的n:m关系,可以使用has_many "through"轻松地在Kohana中使用(在默认角色users-relationship中使用)。但这并不能在"中间"中提供额外的属性。表格,因此您需要使用2 has_many和相应的belongs_to

这可以用简单的英语描述如下:

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

还要考虑far_keyforeign_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.
}