这是我的模型结构:
Person
因此,Family
同时属于School
和$family = Family::find(1);
。
我找了一个家庭:
foreach ($family->members AS $member) {
$member->name;
foreach ($member->school AS $school) {
$school->name;
}
}
列出成员:
name
我如何按照ASC命令foreach ($family->members AS $member) {
$member->school->name;
}
订购学校?
如何订购此清单:
{{1}}
非常抱歉。我已经搞砸了。
我想要达到的目的是按照他们所在学校的名称对家庭成员进行分类。
一个人只能参加一所学校。
答案 0 :(得分:1)
尝试
$family = Family::with(['members.school'=>function($q){
$q->orderBy('name', 'ASC');
}])->find(1);
with
功能会急切加载您的记录,防止出现N + 1查询问题,并使您的应用程序运行得更快。
foreach ($family->members AS $member) {
$member->name;
foreach ($member->school AS $school) {
$school->name;
}
}
希望有所帮助
答案 1 :(得分:1)
我认为您需要急切加载关系,然后订购关系:
$family = Family::with(['members.school' => function($query) {
$query->orderBy('name', 'asc');
}])->find(1);
修改强>
回应你的评论:
如果每个人只属于一所学校怎么办,我想列出 成员按学校名称排序,没有第二个循环?将 使用第二个代码更新问题
由于school()
Person
上的belongsTo
关系为foreach ($family->members AS $member) {
$member->name;
$member->school->name;
}
,我确信您可以继续使用上面的相同查询和热切加载,因此它会返回一个雄辩的记录不多。如果它返回一个雄辩的集合,你只需要另一个for循环。所以你应该能够像这样运行循环:
Person
除非我遗漏了什么?
我还要指出,如果你总是希望按名称排序,你可以在学校的public function schoolOrderedByName() // you could just call it school()
{
return $this->belongsTo('App\School')->orderBy('name', 'asc');
}
对象上定义一个关系并按照这样的顺序排序:
$family = Family::with(members.schoolOrderedByName')->find(1);
然后,每次使用关系时都不必编写约束:
srvc.addCategory(newCtg.ToString());
答案 2 :(得分:0)
在第二个foreach
之前,添加此声明
$schools = $member->school->orderBy('name', 'ASC')->get();
喜欢这个
foreach ($family->members AS $member) {
$member->name;
$schools = $member->school->orderBy('name', 'ASC')->get();
foreach ($schools AS $school) {
$school->name;
}
}