【问题标题】:Laravel Relationship: a table having ids from two other tablesLaravel 关系:具有来自其他两个表的 id 的表
【发布时间】:2017-06-23 08:24:22
【问题描述】:

我的数据库中有两个表:“tours”和“tourists”。

一个“旅游”可以有很多“游客”,“游客”可以参加很多“旅游”。 所以,我已经通过“begonsToMany”关系成功地将它们关联起来(当向“tours”和“tourists”添加行时,中间表“tour_tourist”也被赋予了一行。

“tour_tourist”表结构为:

tour_id | tourist_id
      1 | 37
      1 | 38
      1 | 39

(id 为 37、38 和 39 的游客被分配到 id = 1 的旅游)

问题:“游客”之一(上例中的 37 或 38 或 39 岁)可能是“旅游”的“买家”(上表中的 1 个)。所以只有 1 人支付旅游费用。这个人也可以去旅游/只付钱。通过网络表单提交旅游时,我会传递这些数据(旅游、游客、买家以及他是否参加过旅游)。

所以我想创建一个名为“buyers”的第三张表,它代表支付旅行费用的“游客”:

tour_id | tourist_id | is_tourist
   1    |     39     |     0

(1.一个'tour_id'只能匹配一个'tourist_id')

(2. 'tourist_id' 应该是之前“tour_tourist”表中“属于”“tour_id”的人之一 - 游客 39 属于旅游 1 - 见上表)。

(3. 'is_tourist' 是 1/0,表示买家去旅游/只付钱,在我的例子中是 0 - 他只付钱,不去)。 p>

我想知道如何使用 Eloquent 关系(一对一?hasManyThrough?)来做到这一点。

感谢任何帮助。

【问题讨论】:

  • 你真的需要第三张桌子吗?您不应该在游览表中添加一列“buyer_id”(因为只能有一个买家)吗?
  • 如果没有“is_tourist”,我会这样做。但由于我有一个额外的论点,在我看来,最好为买家单独提供一张桌子......
  • 但是如果游客在 tour_tourist 表中并且他与该旅游相关,则“is_tourist”已经是隐含的。作为游客,您将获得重复的信息。在“buyers”表和“tour_tourist”表中
  • 你所说的“隐含”是什么意思,Amarnasan?:) 无论如何,我真的很想知道怎么做!:)
  • “隐含”是指您已经拥有买家是否为旅行者的信息,因为您已经在 tour_tourist 页面中拥有该信息。抱歉这么挑剔,但我只想让你的代码(和生活)不那么复杂:)

标签: laravel relationship


【解决方案1】:

可能一种更简单的方法是在 tour_tourist 表中创建另外两个名为 is_payeris_tourist 的列,以避免创建第三个表。

tour_tourist 表的结果可能是这样的:

tour_id | tourist_id | is_payer | is_tourist
   1    |     37     |     1    |     0/1
   1    |     38     |     0    |      1
   1    |     39     |     0    |      1

然后,通过 eloquent,您可以使用链接您的 belongsToMany 方法的 withPivot 方法简单地访问您的额外列。

例如,您的 Tour 模型可以是这样的:

游览

class Tour extends Eloquent {
  protected $table = 'tours';

  public function tourists() {
    return $this->belongsToMany('Tourist')->withPivot('is_payer', 'is_tourist');
  }
}

在结果中,您将拥有 is_payeris_tourist

然后您可以使用 Collection 方法将它们过滤掉。

【讨论】:

  • 谢谢你,艾哈迈德!我已经考虑过了,这是解决问题的好方法。但它并不完美,因为我们在 'is_payer' 和 'is_tourist' 中有很多额外的 0 和 1。创建第三张表对我来说只是一种挑战,我认为如果我能处理这样的问题,我会成为一个更好的 laravel 开发人员。
  • 如果您愿意,您可以随时使用第三张桌子。为了访问您的第三张表,您可以使用嵌套的 Eager Loading。例如像这样:Tour::with(['tourists' => function($q) { $q->with('payers') }])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多