Laravel关系:有很多不同的类

时间:2013-12-17 07:46:49

标签: orm laravel laravel-4 eloquent

考虑Laravel 4.1中的以下场景

  • 有一个 Set 模型,可能有很多项目(按优先级排序,但暂时可以暂时搁置)
  • 这些物品中的每一个都可以是不同的“种类”(想想包含钥匙,钱包,香烟的包(套装)......)

理想情况下,我想实现以下目标:

  • 在Set及其项目之间具有简化的,可加载的关系(下面将更好地解释)
  • 保留项目模型DRY(理想情况下每个项目扩展一个带有基本样板代码的抽象类)

为了更好地说明我的想法:

class Set extends Eloquent {
    // ...
    public function items() {
         // provides a "transparent" method to access ALL of its items ... no matter what class
    }
}

class SubItemOne extends Item { // ... } 
class SubItemTwo extends Item { // ... } 

abstract class Item extends Eloquent {
    public function set() {
        return $this->belongsTo('Set');
    }
}

因为每个子类的核心与其他子类共享很多共同点(想想:它们都可以在集合中移动,或者它们可以附加图像等......所有这些都可能是在抽象Item类中定义。)

基本上,我希望能够在

等情况下访问属于我的Set的所有项目
 Set::with('items')->find(1);

但我真的不确定用于'逆'的关系是什么类型。

到目前为止我考虑过的事情:

  • 取出子类型模型,只保留一个带有“item_kind”标志的Item模型来标识其类型。让每个项目根据这个标志定义与另一个类的关系...(对我来说已经听起来很丑陋)
  • 多态关系(包括L 4.1中引入的新N-2-N)虽然它们似乎并没有真正考虑过这个特定场景:特别是N2N仍然无法解决问题通过一个简单的关系访问所有项目
  • 抛弃了可加载的关系并编写了一个自定义的“get_items()”方法来访问各个关系(如 - > subitemones(), - > subitemtwos()等)但这看起来像个笨蛋解决这个问题的方法(我真的希望能够访问查询构建器中的关系)

我有点被困在这里,但我无法相信我是唯一面对这种情况的人......我真的希望这里有一个“最佳实践”的建议!

1 个答案:

答案 0 :(得分:0)

你可以将你的课程层级与数据库层次结合起来。有许多方法可以在数据库模式中表示继承。

考虑您的情况,您可以拥有以下表格:

  • 设置:此实体映射您的父类并存储设置项的所有常用信息(例如位置等)
  • SubItemOne:扩展“set”实体,并仅存储特定于此类型的其他信息。
  • SubitemTwo ... etc

SubItemXXX Set 实体具有1:1的关系。您只需要一个简单的JOIN来合并 SubItemXXX Set

您可以在以下网址了解详情:How can you represent inheritance in a database?