Eloquent 按关系排序和分组
Eloquent Sorting and Grouping on Relationship
我有三个 tables 简化如下:
People (id, first_name, last_name)
Awards (id, name)
AwardPerson (id, people_id, award_id, year_gained)
我需要在页面上显示这个,奖项按年份降序排列。理想情况下,我希望有一个这样的集合或数组:
array(
'2005' => array(
'AwardPerson' => array(
'person' => array(person data...),
'award' => array(award data...)
),
'AwardPerson2' => array(
'person' => array(person data...),
'award' => array(award data...)
),
)
'2004' => array(...
目前我的查询设置如下:
$years = AwardPerson::whereHas('person', function($q)
{
$q->current() //get only people with current appoitnments
})
->with('person', 'award')
->orderBy('year_gained', 'desc')
->get();
$years = $years->groupBy('year_gained');
这很好,除了我需要能够按人对每个 AwardPerson 进行排序->last_name。我试过在按年份分组后循环、遍历和排序:
$years->each(function($year)
{
usort($year, function($a, $b)
{
if($a->person->last_name == $b->person->last_name)
{
return 0;
}
return ($a->person->last_name < $b->person->last_name) ? -1 : 1;
});
});
但这似乎对顺序没有影响。我也知道我可能应该使用数据透视表 table 来执行此查询,但我不知道如何以这种方式获取正确格式的数据。
你有什么,然后添加一个与人的连接,就像这样。
$years = AwardPerson
->select('AwardPerson.*')
->whereHas('person', function($q)
{
$q->current() //get only people with current appoitnments
})
->join('people', 'people.id', '=', 'AwardPerson.id')
->with('person', 'award')
->orderBy('year_gained', 'desc')
->orderBy('people.last_name', 'ASC')
->get();
$years = $years->groupBy('year_gained');
我有三个 tables 简化如下:
People (id, first_name, last_name)
Awards (id, name)
AwardPerson (id, people_id, award_id, year_gained)
我需要在页面上显示这个,奖项按年份降序排列。理想情况下,我希望有一个这样的集合或数组:
array(
'2005' => array(
'AwardPerson' => array(
'person' => array(person data...),
'award' => array(award data...)
),
'AwardPerson2' => array(
'person' => array(person data...),
'award' => array(award data...)
),
)
'2004' => array(...
目前我的查询设置如下:
$years = AwardPerson::whereHas('person', function($q)
{
$q->current() //get only people with current appoitnments
})
->with('person', 'award')
->orderBy('year_gained', 'desc')
->get();
$years = $years->groupBy('year_gained');
这很好,除了我需要能够按人对每个 AwardPerson 进行排序->last_name。我试过在按年份分组后循环、遍历和排序:
$years->each(function($year)
{
usort($year, function($a, $b)
{
if($a->person->last_name == $b->person->last_name)
{
return 0;
}
return ($a->person->last_name < $b->person->last_name) ? -1 : 1;
});
});
但这似乎对顺序没有影响。我也知道我可能应该使用数据透视表 table 来执行此查询,但我不知道如何以这种方式获取正确格式的数据。
你有什么,然后添加一个与人的连接,就像这样。
$years = AwardPerson
->select('AwardPerson.*')
->whereHas('person', function($q)
{
$q->current() //get only people with current appoitnments
})
->join('people', 'people.id', '=', 'AwardPerson.id')
->with('person', 'award')
->orderBy('year_gained', 'desc')
->orderBy('people.last_name', 'ASC')
->get();
$years = $years->groupBy('year_gained');