【问题标题】:Laravel relations, same parent as grandparent: good practice or not?Laravel 关系,与祖父母相同的父母:好的做法与否?
【发布时间】:2017-12-04 21:32:23
【问题描述】:

因为您可以使用 Laravel 框架非常轻松地定义关系。我想知道在athletes 表中有一个nation_id 是否很好。

我在 Laravel 中建立了以下关系:


国家模式:

public function athletes() {
    return $this->hasMany(Athlete::class, 'id', 'nation_id');
}

俱乐部模式:

public function nation() {
    return $this->belongsTo(Nation::class, 'nation_id', 'id');
}
public function athletes() {
    return $this->hasMany(Athlete::class, 'id', 'club_id');
}

运动员模特:

public function nation() {
    return $this->belongsTo(Nation::class, 'nation_id', 'id');
}
public function club() {
    return $this->belongsTo(Club::class, 'club_id', 'id');
}

既然你可以这样做来获得运动员的国家:Athlete::where('id', $id)->first()->club->nation,我想知道在那里也有国家功能是否是一种好习惯。

【问题讨论】:

  • 您可以将其附加为属性并简单地调用 Athlete::find($id)->nation,但我认为俱乐部国家和运动员国家不必相同。然后调用 Athlete::find($id)->club->nation 返回俱乐部国家。
  • 但我想知道这是否有更多的服务器负载或者是不必要的。有缺点吗?
  • 并非如此。我认为如果运动员只能拥有一个国家并且您不需要更多信息(例如用户国家何时更改),那很好。不要在这里考虑性能,而要考虑它将如何为您工作。
  • 谢谢杰斐逊,真的很有帮助。我不确定我的方法,但谢谢。用户所在的国家不能改变,但用户所在的俱乐部可以,用户所在的俱乐部国家也可以。在这种情况下,我认为hasManyThrough 不会很好。

标签: php database laravel database-design eloquent


【解决方案1】:

您可以在Nation 模型上使用hasManyThrough 来访问Athlete,而不必在两者之间建立直接关系。

所以在你的国家模型上:

public function clubs()
{
    return $this->hasMany(Club::class);
}

public function athletes()
{
    return $this->hasManyThrough(Athlete::class, Club::class);
}

【讨论】:

  • 你能用超过 3 个模型做这个吗?
  • 您不能使用超过 3 个的 hasManyThrough,但您可以在 3 个之后开始在 hasManyThrough 上进行预加载,例如 Nation::with('athletes.events')->get()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2015-09-27
  • 2020-03-30
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多