按关系顺序排序

时间:2016-04-28 16:51:55

标签: laravel eloquent

这是我的模型结构:

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}}

编辑2

非常抱歉。我已经搞砸了。

我想要达到的目的是按照他们所在学校的名称对家庭成员进行分类。

一个人只能参加一所学校。

3 个答案:

答案 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;
    }
}