Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Orm 拉维关系:有许多不同的类别_Orm_Laravel_Laravel 4_Eloquent - Fatal编程技术网

Orm 拉维关系:有许多不同的类别

Orm 拉维关系:有许多不同的类别,orm,laravel,laravel-4,eloquent,Orm,Laravel,Laravel 4,Eloquent,考虑Laravel 4.1中的以下场景 有一个集合模型可能有许多项(按优先级排序,但这可以暂时搁置) 这些物品中的每一件都可以是不同的“种类”(想想一个包(套装),里面有钥匙、钱包、雪茄……) 理想情况下,我希望实现以下目标: 在集合和它的项之间有一个简化的、可加载的关系(下面将更好地解释) 保持项目模型干燥(理想情况下,每个项目都使用基本样板代码扩展一个抽象类) 为了更好地说明我的想法: class Set extends Eloquent { // ... publi

考虑Laravel 4.1中的以下场景

  • 有一个集合模型可能有许多项(按优先级排序,但这可以暂时搁置)
  • 这些物品中的每一件都可以是不同的“种类”(想想一个包(套装),里面有钥匙、钱包、雪茄……)
理想情况下,我希望实现以下目标:

  • 在集合和它的项之间有一个简化的、可加载的关系(下面将更好地解释)
  • 保持项目模型干燥(理想情况下,每个项目都使用基本样板代码扩展一个抽象类)
为了更好地说明我的想法:

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

因为在其核心,每个子类与其他子类有很多共同之处(想想:它们都可以在集合中移动,或者可以附加一个图像等等……所有这些都可以在抽象项类中定义)

本质上,我希望能够在以下情况下访问属于我的集合的所有项

 Set::with('items')->find(1);
但我真的不确定用什么样的关系来表示“反向”

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

  • 去掉子类模型,只保留一个带有“Item_kind”标志的Item模型来标识其类型。让每个项目基于此标志定义与另一个类的关系。。。(对我来说已经很难听了)
  • 多态关系(包括L4.1中引入的新N-2-N),尽管它们似乎并没有真正考虑到这个特定场景:特别是N2N仍然不能解决通过一个简单关系访问所有项目的问题
  • 抛开急切的可加载关系,编写一个自定义的“get_items()”方法来访问各个关系(如->subitemones(),->subitemtwos()等),但这似乎是解决这个问题的一个相当愚蠢的方法(我真的希望能够在查询生成器中访问关系)

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

您可以考虑将类层次映射到DB层次。在DB模式中有许多表示继承的方法

考虑到您的场景,您可以使用以下表格:

  • 集合:该实体映射父类并存储集合项的所有公共信息(如位置等)
  • SubItemOne:扩展“set”实体,并仅存储特定于此类型的附加信息
  • 第二项。。。等
子项XXX与集合实体具有1:1的关系。您所要做的只是一个简单的连接来合并子项xxx和Set

您可以在以下网址阅读更多内容:

 Set::with('items')->find(1);