php复杂laraveleloquent集合排序
php complex laravel eloquent collection sort
我有相当复杂的 laravel eloquent 集合,需要按项目 ID、日期、用户名排序。
我一直在搜索 google 但没有人问过或写过关于这种复杂排序的问题。
如果我只使用 desc 或 asc 顺序与 sortBy 函数。它有效,但如果我尝试同时使用 desc/asc,它会混淆..
我该如何解决这个问题???
集合结构
collection {
array (size=148)
0 =>
attribute:
id:100,
date:"2015-02-03"
relations:
0 project(belongstomany relationship)
projectid: 1
1 user(belongstomany relationship)
username:"test"
}
应该这样排序
project id(desc) date(desc) name(asc)
9 2015-02-31 test1
9 2015-02-30 test2
8 2015-02-30 test2
7 2015-02-29 test3
6 2015-02-28 test4
5 2015-02-27 test5
你可以随心所欲,但你必须使用sort()
方法,而不是sortBy()
方法。 sort()
方法将采用一个闭包,您可以使用它来定义自定义排序算法。基本上,如果您将闭包传递给 sort()
,它会调用 PHP 的 usort()
和您的闭包来对项目进行排序。
这只是您所寻找内容的粗略概念。您可能需要对其进行调整,因为您发布的内容几乎没有不确定性。您可以将其定义为传递给 sort()
的实际函数,或者您可以将其作为匿名函数传递给 sort()
。
function ($a, $b) {
/**
* Your question states that project is a belongsToMany relationship.
* This means that project is a Collection that may contain many project
* objects, and you need to figure out how you want to handle that. In
* this case, I just take the max projectid from the Collection (max,
* since this field will be sorted desc).
*
* If this is really just a belongsTo, you can simplify this down to
* just $a->project->projectid, etc.
*/
$aFirst = $a->project->max('projectid');
$bFirst = $b->project->max('projectid');
/**
* If the projectids are equal, we have to dig down to our next comparison.
*/
if ($aFirst == $bFirst) {
/**
* Since the first sort field (projectids) is equal, we have to check
* the second sort field.
*/
/**
* If the dates are equal, we have to dig down to our next comparison.
*/
if ($a->date == $b->date) {
/**
* Your question states that user is a belongsToMany relationship.
* This means that user is a Collection that may contain many user
* objects, and you need to figure out how you want to handle that.
* In this case, I just take the min username from the Collection
* (min, since this field will be sorted asc).
*/
$aThird = $a->user->min('username');
$bThird = $b->user->min('username');
/**
* If the final sort criteria is equal, return 0 to tell usort
* that these two array items are equal (for sorting purposes).
*/
if ($aThird == $bThird) {
return 0;
}
/**
* To sort in ascending order, return -1 when the first item
* is less than the second item.
*/
return ($aThird < $bThird) ? -1 : 1;
}
/**
* To sort in descending order, return +1 when the first item is
* less than the second item.
*/
return ($a->date < $b->date) ? 1 : -1;
}
/**
* To sort in descending order, return +1 when the first item is
* less than the second item.
*/
return ($aFirst < $bFirst) ? 1 : -1;
}
有关 usort()
工作原理的更多信息,您可以 check the docs。
我有相当复杂的 laravel eloquent 集合,需要按项目 ID、日期、用户名排序。
我一直在搜索 google 但没有人问过或写过关于这种复杂排序的问题。
如果我只使用 desc 或 asc 顺序与 sortBy 函数。它有效,但如果我尝试同时使用 desc/asc,它会混淆..
我该如何解决这个问题???
集合结构
collection {
array (size=148)
0 =>
attribute:
id:100,
date:"2015-02-03"
relations:
0 project(belongstomany relationship)
projectid: 1
1 user(belongstomany relationship)
username:"test"
}
应该这样排序
project id(desc) date(desc) name(asc)
9 2015-02-31 test1
9 2015-02-30 test2
8 2015-02-30 test2
7 2015-02-29 test3
6 2015-02-28 test4
5 2015-02-27 test5
你可以随心所欲,但你必须使用sort()
方法,而不是sortBy()
方法。 sort()
方法将采用一个闭包,您可以使用它来定义自定义排序算法。基本上,如果您将闭包传递给 sort()
,它会调用 PHP 的 usort()
和您的闭包来对项目进行排序。
这只是您所寻找内容的粗略概念。您可能需要对其进行调整,因为您发布的内容几乎没有不确定性。您可以将其定义为传递给 sort()
的实际函数,或者您可以将其作为匿名函数传递给 sort()
。
function ($a, $b) {
/**
* Your question states that project is a belongsToMany relationship.
* This means that project is a Collection that may contain many project
* objects, and you need to figure out how you want to handle that. In
* this case, I just take the max projectid from the Collection (max,
* since this field will be sorted desc).
*
* If this is really just a belongsTo, you can simplify this down to
* just $a->project->projectid, etc.
*/
$aFirst = $a->project->max('projectid');
$bFirst = $b->project->max('projectid');
/**
* If the projectids are equal, we have to dig down to our next comparison.
*/
if ($aFirst == $bFirst) {
/**
* Since the first sort field (projectids) is equal, we have to check
* the second sort field.
*/
/**
* If the dates are equal, we have to dig down to our next comparison.
*/
if ($a->date == $b->date) {
/**
* Your question states that user is a belongsToMany relationship.
* This means that user is a Collection that may contain many user
* objects, and you need to figure out how you want to handle that.
* In this case, I just take the min username from the Collection
* (min, since this field will be sorted asc).
*/
$aThird = $a->user->min('username');
$bThird = $b->user->min('username');
/**
* If the final sort criteria is equal, return 0 to tell usort
* that these two array items are equal (for sorting purposes).
*/
if ($aThird == $bThird) {
return 0;
}
/**
* To sort in ascending order, return -1 when the first item
* is less than the second item.
*/
return ($aThird < $bThird) ? -1 : 1;
}
/**
* To sort in descending order, return +1 when the first item is
* less than the second item.
*/
return ($a->date < $b->date) ? 1 : -1;
}
/**
* To sort in descending order, return +1 when the first item is
* less than the second item.
*/
return ($aFirst < $bFirst) ? 1 : -1;
}
有关 usort()
工作原理的更多信息,您可以 check the docs。