【问题标题】:Multiple 1 to 1 relationships for common model公共模型的多个 1 对 1 关系
【发布时间】:2013-12-20 14:06:44
【问题描述】:

我正在使用 Laravel 4 构建一个应用程序,并使用 Eloquent 作为 ORM。

我认为描述我的问题的最简单方法是举个例子,尽管不太可能......

我有一个 Cookie 模型(如 OREO 等)。 Cookie 又可以属于人类或外星人。所以...

是否可以(正确)说:

Cookie 属于人类

Cookie 属于 Alien?

同一个 Cookie 不能同时属于人类和外星人,也不能在同一物种的成员之间共享。

所以我想我真正要问的是,Cookie 表是否可以有两个外键列,一个用于人类,一个用于外星人?

提前感谢您的建议。

【问题讨论】:

    标签: orm laravel-4 relational-database foreign-key-relationship eloquent


    【解决方案1】:

    你可以有这个:

    name       type   nullable
    ------------------------------
    id         int    no
    name       text   no
    human_id   int    yes 
    alien_id   int    yes
    

    那些可能是你的课程:

    class Cookie extends Eloquent {
    
        public function human()
        {
            return $this->belongsTo('Human', 'human_id');
        }
    
        public function alien()
        {
            return $this->belongsTo('Alien', 'alien_id');
        }
    
    }
    
    class Alien extends Eloquent {
    
        public function cookie()
        {
            return $this->hasOne('Cookie', 'alien_id');
        }
    
    }
    
    class Human extends Eloquent {
    
        public function cookie()
        {
            return $this->hasOne('Cookie', 'human_id');
        }
    
    }
    

    然后你可以这样使用它们:

    $human = Human::find(1);
    
    echo $human->cookie->name;
    
    $cookie = Cookie::find(1);
    
    if ($cookie->human) echo $cookie->human->name;
    if ($cookie->alien) echo $cookie->alien->name;
    

    【讨论】:

    • 看起来和我的想法一模一样。确认某件事是好主意还是“好习惯”总是好的。感谢您的详细回复。
    • 安东尼奥,只是一个简单的问题。如果答案不直截了当,我可以打开一个单独的问题。我将如何处理一个模型,其实例可以作为彼此的孩子出现。例如,教科书中的一个章节,可以有很多子章节,它们本身可以有子章节等等。Section 表中的外键引用它自己?
    • 嵌套集在任何语言上都是一个问题。我正在使用递归 SQL 查询来处理它们,但您可以使用这样的包:registry.autopergamene.eu/package/etrepat-baum.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多