【问题标题】:Polymorphic relation in Eloquent ORM (Laravel)Eloquent ORM(Laravel)中的多态关系
【发布时间】:2015-04-23 09:42:57
【问题描述】:

我正在尝试通过在 Eloquent ORM 中使用多态关系来实现继承。

我的模型架构如下所示:

class Section extends Model {
    public function blocks() { // section has many blocks }
}
abstract class Block extends Model {..}
class Exercise extends Block {..}
class Info extends Block {..}

所以在我的例子中,Section 有一个块数组(每个元素可以是练习或信息)。

我试图告诉 Eloquent,Section.blocks 是与 BlockhasMany 关系,而 BlockmorphedTo 通过它与 Exercise 或 Infoblockable 关系,但我失败了(而且它似乎也不是正确的方法,因为它创建了一个额外的属性,例如$section->blocks[0]->blockable,它应该是$section->blocks[0])。

我也尝试立即从 Section.blocks morphTo,但也失败了。

也许有人已经做到了这一点,并且可以为我指明正确的方向。

【问题讨论】:

    标签: laravel inheritance ember.js polymorphism eloquent


    【解决方案1】:

    这个问题有点含糊,但您的模型应该如下所示。如果有任何差异,请添加失败时得到的确切错误。

    class Section extends Model {
        public function blocks() {
            return $this->morphTo();
        }
    }
    
    class Exercise extends Block {
        public function sections() {
            return $this->morphMany('App\Section', 'blocks');
        }
    }
    
    class Info extends Block {
        public function sections() {
            return $this->morphMany('App\Section', 'blocks');
        }
    }
    

    【讨论】:

    • 我从section->relations->blocks 得到的是null。这就是我的数据库架构的样子:db schema
    • 如果您有 info 对象并且想要获取 Section,那么您可以使用 $info->sections
    • 不不,我想获取一个部分的块列表(数组)(通过多态性将是信息或练习)。像这样:section->blocks
    • 我明白了,如果你想拥有多态的多对多关系,那就有点不同了。以我的例子$section->blocks 只给你一个块你需要非常密切地遵循本指南laravel.com/docs/5.0/…
    猜你喜欢
    • 2015-04-16
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2020-03-25
    • 2014-03-12
    相关资源
    最近更新 更多