Php 使用ArrayDataProvider使用一个数据提供程序对混合模型进行排序
我曾经混合模型,然后将它们合并到一个数据提供者中。我在grid view中使用了数据提供程序,一切正常。 但是我需要将网格视图按一列排序。我尝试了很多解决方案,但都没有成功 这是我的型号代码(按项目订单) 任何解决方案都是非常好的,即使使用纯PHP对数组进行排序,我想都可以解决这个问题。您可以使用Php 使用ArrayDataProvider使用一个数据提供程序对混合模型进行排序,php,arrays,activerecord,yii,yii2,Php,Arrays,Activerecord,Yii,Yii2,我曾经混合模型,然后将它们合并到一个数据提供者中。我在grid view中使用了数据提供程序,一切正常。 但是我需要将网格视图按一列排序。我尝试了很多解决方案,但都没有成功 这是我的型号代码(按项目订单) 任何解决方案都是非常好的,即使使用纯PHP对数组进行排序,我想都可以解决这个问题。您可以使用 usort($finalList,function($a,$b){ 返回$a['item_order']中添加您的条件, public function getAllSelectedItemsInTh
usort($finalList,function($a,$b){
返回$a['item_order']<$b['item_order'];
});
在回调>中添加您的条件,
public function getAllSelectedItemsInTheUnit($unitId, $grid = false)
{
$finalList = array();
$storiesList = array();
$activityList = array();
$breakList = array();
$stories = UnitStories::find()->joinWith(['story'])->where("unit_id=$unitId")->all();
if (count($stories) > 0) {
foreach ($stories as $item) {
$storiesList[] = [
'key' => self::TYPE_STORY . $item->id,
'id' => $item->id,
'title' => $item->story->title,
'type' => self::TYPE_STORY,
'item_order' => $item->unit_order,
];
}
}
$activities = UnitActivities::find()->joinWith(['activity'])->where("unit_id=$unitId")->all();
if (count($activities) > 0) {
foreach ($activities as $item) {
$activityList[] = [
'key' => self::TYPE_ACTIVITY . $item->id,
'id' => $item->id,
'title' => $item->activity->title,
'type' => self::TYPE_ACTIVITY,
'item_order' => $item->activity_order,
];
}
}
$breaks = UnitBreaks::find()->where("unit_id=$unitId")->all();
if (count($breaks) > 0) {
foreach ($breaks as $item) {
$breakList[] = [
'key' => self::TYPE_BREAK . $item->id,
'id' => $item->id,
'title' => $item->title,
'type' => self::TYPE_BREAK,
'item_order' => $item->unit_order,
];
}
}
$finalList = array_merge($storiesList, $activityList, $breakList);
$dataProvider = new ArrayDataProvider([
'allModels' => $finalList, 'key' => 'key',
'sort' => [
'attributes' => ['item_order'],
],
]);
return $dataProvider;
}
usort($finalList, function ($a, $b) {
return $a['item_order'] < $b['item_order'];
});