【问题标题】:Kohana/PHP - Defining ORM relationship for the 'favorites' tableKohana/PHP - 为“收藏夹”表定义 ORM 关系
【发布时间】:2014-08-21 01:25:33
【问题描述】:

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

  • 用户

身份证

名字

姓氏

  • 用户作业

身份证

工作信息

  • 已加星标的工作

身份证

user_id

userjob_id

cmets

结束日期

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

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

我是否正确定义了关系?

【问题讨论】:

    标签: php kohana kohana-3.3


    【解决方案1】:

    简短回答:不。您在这里拥有的是典型的n:m 关系,可以使用has_many "through" 在 Kohana 中轻松使用(在默认角色 users-relationship 中使用)。但这不允许在“中间”表中添加额外的属性,因此您需要使用 2 个has_many 和对应的belongs_to

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

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

    还要考虑far_keyforeign_key 之间的区别(遗憾的是官方文档没有涵盖它),但要记住一个简单的规则:另一张表中的键很远 -> 它是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.
    }
    

    【讨论】:

    • 感谢您的时间和关注
    猜你喜欢
    • 2013-01-27
    • 2011-03-24
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多