2016-05-17 3 views
0

Я пытаюсь сортировать таблицу с родительскими и дочерними строками. Сортировка всегда должна выполняться на основе родительских строк, но дочерние последовательности всегда должны немедленно следовать за родителем. Таблица данных в форматеСортировка родительского ребенка

[ 
{name: 'xxx', group: 'A', type: 'parent'}, 
{name: 'yyy', group: 'B', type: 'parent'}, 
{name: 'zzz', group: 'A', type: 'child'}, 
{name: 'qqq', group: 'A', type: 'child'} 
] 

Итак, отсортированных по имени правильный порядок будет ххх, QQQ, ZZZ, ууу.

Данные взяты из запроса ajax Laravel/Eloquent и отображаются в таблице datatables, поэтому сортировка на стороне клиента или сервера будет прекрасной.

Не относится к Multisort (комментарий ниже)

+0

Возможный дубликат [PHP массив сортировки двумя значениями полей] (http://stackoverflow.com/questions/4582649/php-sort-array-by-two-field- значения) – Henders

+0

Пожалуйста, добавьте код того, что вы пробовали до сих пор. – Ruben

+0

Henders: Это не сценарий array_multisort. array_multisort сортирует по нескольким измерениям по порядку. то же самое может быть достигнуто с помощью поведения mysql by by или default datatables. Мне нужен простой одномерный вид, за исключением того, что некоторые строки должны быть сгруппированы вместе (т.е. дети группы, следующей за родителем), независимо от логического порядка сортировки. сортировка по группам, тип приведет к правильному поведению, но только если сортировка по группе является желаемым результатом. сортировка по любому другому столбцу является проблемой здесь. – deedoo

ответ

0

Не удалось выяснить, как это сделать в SQL, обратных вызовах/сортировщиках DataTables (хотя плагин будет работоспособным), Eloquent callbacks или Yajra DataTables. Поэтому я просто пошел грубо.

  1. сортировать по назначению колонки с использованием SQL
  2. отдельного мастер/ребенок (долг/гарантии) линиями
  3. посмотреть основную запись каждого ребенка линий для правильного индекса сортировки и создать новый столбец индексированию "истинный" порядок

     $dataTable_column_map = $claimPortfolio->getColumnMap(); 
         $claimPortfolioLines = $claimPortfolio->lines()->orderBy($dataTable_column_map[$request->get('order')[0]['column']]['name'], $request->get('order')[0]['dir'])->get(); 
         $claimPortfolioLines = ClaimPortfolioService::orderGuarantees($claimPortfolioLines); 
         $claimPortfolioLines = ClaimPortfolioService::filterLines($claimPortfolioLines, Input::get('search.value')); 
         Session::put('claimPortfolioLineIdList', $claimPortfolioLines->lists('id')->toArray()); 
    
         return Datatables::of($claimPortfolioLines) 
          ->order(function() { 
           return true; // cancel built-in ordering & filtering 
          }) 
          ->filter(function() { 
           return true; 
          }) 
          ->make(true); 
    
    
         public static function orderGuarantees(Collection $claimPortfolioLines) 
         { 
          $claimPortfolioLinesGuarantees = $claimPortfolioLines->filter(function ($claimPortfolioLine) { 
           return $claimPortfolioLine->line_type == 'GUARANTEE'; 
          }); 
          $claimPortfolioLines = $claimPortfolioLines->filter(function ($claimPortfolioLine) { 
           return $claimPortfolioLine->line_type == 'DEBT'; 
          }); 
          foreach ($claimPortfolioLines as $idx_line => $claimPortfolioLine) 
          { 
           $claimPortfolioLine->sortOrder = $idx_line; 
           foreach ($claimPortfolioLinesGuarantees as $idx_guaranteeLine => $claimPortfolioLineGuarantee) 
           { 
            if ($claimPortfolioLineGuarantee->contract_no == $claimPortfolioLine->contract_no && $claimPortfolioLine->line_type == 'DEBT') 
            { 
             $claimPortfolioLineGuarantee->sortOrder = "{$idx_line}.{$idx_guaranteeLine}"; 
             $claimPortfolioLines->push($claimPortfolioLineGuarantee); 
            } 
           } 
          } 
    
          $claimPortfolioLines = $claimPortfolioLines->sortBy('sortOrder'); 
    
          return $claimPortfolioLines; 
         } 
    
0

Используйте orderFixed опцию, чтобы всегда применять заказ в определенной колонке до/после каких-либо других столбцов.

Например:

var table = $('#example').DataTable({  
    ajax: { 
     url:'https://api.myjson.com/bins/4n6ey', 
     dataSrc: '' 
    }, 
    orderFixed: { 
     pre: [[1, 'asc'], [2, 'desc']] 
    }, 
    columns: [ 
     { data: 'name' }, 
     { data: 'group' }, 
     { data: 'type'} 
    ] 
}); 

См this jsFiddle для кода и демонстрации.

+0

Не совсем. Это блокирует родительский порядок на месте и сортирует только дочерние строки, например, группа A всегда перед B, что не является правильным порядком для сортировки обратного имени (y, x, z, q). На самом деле, я действительно не забочусь о детском заказе, ключевой порядок - ключевой. – deedoo

Смежные вопросы