gpt4 book ai didi

laravel - 模型关系在这种情况下如何运作?

转载 作者:行者123 更新时间:2023-12-02 10:12:17 27 4
gpt4 key购买 nike

我需要创建一个数组,用于存储有关 session 中特定注册的信息。需要存储:

  • session 名称
  • 注册类型名称和价格
  • 数组中还需要存储特定注册的每种注册类型的数量。可以使用参与者表获取数量,因为参与者表的结构如下:参与者表:id,registration_id,registration_type_id。因此可以针对特定的registration_id 计算该注册存在多少个registration_type_id。

因此需要进行涉及注册、 session 和参与者 3 个表的查询,因此查询应如下所示,并且由于模型关系,顺序为“conference.registrationTypes.participants”,对吧?

    $registrationTypeDetails = Registration::with('conference.registrationTypes
.participants')->find($registrationID);

然后下面的这个 foreach 将每个注册类型的数量存储在 $type_counts 中,它的工作原理 $type_counts 显示:

 array:2 [▼
"general" => 2
"plus" => 1
]

代码:

  $type_counts = [];
foreach ($registrationTypeDetails->participants as $p) {
$name = $p->registration_type->name;
if (!isset($type_counts[$name])) {
$type_counts[$name] = 0;
}
$type_counts[$name]++;
}

但我不明白 $type_counts 如何显示这一点,以及关系如何工作以获得该结果,因为 dd($registrationTypeDetails) 显示如下。

$registrationTypeDetails->participants 显示如下,关系为空,所以我不明白“$p->registration_type->name”如何显示注册类型名称。

Collection {#335 ▼
#items: array:2 [▼
0 => Participant {#350 ▼
#relations: []
}
1 => Participant {#343 ▼
#relations: []
}
]
}

你知道foreach中的“$name = $p->registration_type->name;”是如何获取正确的注册类型名称的吗?

此外$registrationTypeDetails显示:

Registration {#334 ▼
#relations: array:1 [▼
"conference" => Conference {#342 ▼
#relations: array:1 [▼
"registrationTypes" => Collection {#346 ▼
#items: array:2 [▼
0 => RegistrationType {#349 ▼
#relations: array:1 [▼
"participants" => Collection {#514 ▶}
]
}
1 => RegistrationType {#351 ▼
#relations: array:1 [▼
"participants" => Collection {#348 ▶}
]
}
]
}
]
}
]
}

最佳答案

我观察到调用$registrationTypeDetails->participants检索参与者与Registration的关系(这不是预先加载的)

当您打电话时:

Registration::with('conference.registrationTypes.participants')->find($registrationID);

它使用具有急切加载关系的 registrationId 检索 Registration 的单个记录。但是,当您使用以下 $registrationTypeDetails->participants 时,您将使用该记录进行新的查询,因此您拥有可以运行循环的 participants 模型集合。

它之所以有效,是因为您已经定义了注册参与者之间的关系(错误的可能性有限)。

因为您在执行 $registrationTypeDetails->participants 时没有预先加载 participants 关系,所以您不希望它向您显示关系。即使您注意到 dd($registrationTypeDetails) 显示了第一个急切加载查询的结果。

当您在循环调用时会看到相同的效果 $p->registration_type->name; 这也会使用循环点处的单个记录运行一个新的查询(该记录有比如说 registration_type_id 的两个属性都引用 participants 表上的 registration_type 关系...依此类推...

总之,这解释了为什么您可以在不使用 with()load() 方法的情况下将相关模型作为集合访问。

关于laravel - 模型关系在这种情况下如何运作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51161718/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com