【问题标题】:Data Relationship patterns数据关系模式
【发布时间】:2014-03-31 12:46:52
【问题描述】:
Tables:
-Incidents
--references locations thru location_id
-Locations
--references areas thru area_id
-Areas

每个区域都有位置,事件可能发生在任何位置。

我如何设置关系,以便我可以有雄辩的抓取,一个区域或位置的所有事件?

我是否还必须引用事件表中的 area_id?

【问题讨论】:

  • 事件模型中最好不要引用area_id:如果位置的区域发生变化,事件会链接到错误的区域。
  • 感谢您指出这一点
  • 您可能希望查看关系类型hasManyThrough,它能够将事件加入区域,同时保持与位置的中间关系。这样,您应该能够使用$area->incidents 来简单地获取给定区域的事件列表。
  • 谢谢@alexrussell,我知道它现在如何适用于这种情况了
  • 显然,这种关系的反面并不那么简单,但它几乎一样简单:只需执行$incident->location->area 即可获取事件所在的区域。

标签: mysql database laravel eloquent


【解决方案1】:

您也可以进行嵌套关系查询。

例如:

Incidents::with(array('location', function($q) use ($areaId) {
    return $q->where('area_id', $areaId);
}))->get();

查看http://laravel.com/docs/eloquent#eager-loading下的“急切加载约束”

【讨论】:

    【解决方案2】:

    不应在事件表中引用 area_id,因为它已经通过 location_id 间接存在。

    在设计关系数据库表结构时,请始终应用 normalization 并尽可能将您的模式带入第三范式。

    究竟是什么问题?您已经描述了表之间的关系。如果具体实现有什么具体的,请告诉我。

    【讨论】:

    • 谢谢,我认为我的方向是正确的,@hannesvdvreken 阐明了我应该如何从雄辩的 orm 方面处理它。
    猜你喜欢
    • 2017-04-03
    • 2016-09-24
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多