我需要创建一个数组,用于在会议中存储有关特定注册的信息。需要存储:
因此有必要进行涉及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 ▶}
]
}
]
}
]
}
]
}
答案 0 :(得分:0)
我发现呼叫方$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;
的循环时,会看到相同的效果。这还会在循环点使用单个记录运行一个新查询(该记录具有引用registration_type_id
的两个属性registration_type
表上的participants
关系...依此类推...
总而言之,这就是为什么不使用with()
或load()
方法就可以将相关模型作为集合访问的原因的说明。