我需要创建一个数组,用于存储有关 session 中特定注册的信息。是否需要存储:
所以有必要做一个涉及注册, 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);
它使用具有预先加载关系的
Registration
检索 registrationId
的单个记录。但是,当您使用以下 $registrationTypeDetails->participants
时,您正在使用该记录进行新的查询,因此您拥有可以运行循环的 participants
模型集合。它有效是因为您已经定义了
Registration
和 Participant
之间的关系(这是错误的可能性有限)。因为您在执行
participants
时没有预先加载 $registrationTypeDetails->participants
关系,所以您不希望它向您显示这些关系。即使您注意到 dd($registrationTypeDetails)
向您显示了您的第一个预加载查询的结果。当你在循环调用
$p->registration_type->name;
时看到同样的效果这也使用循环点的单个记录运行一个新的查询(这个记录有两个属性 say registration_type_id
引用 registration_type
表上的 participants
关系......等等...总之,这就是为什么您可以在不使用
with()
或 load()
方法的情况下将相关模型作为集合访问的解释。关于laravel - 模型关系在这种情况下是如何工作的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51161718/