2016-05-17 10 views
0

親行と子行を持つ表をソートしようとしています。並べ替えは常に親行に基づいて実行する必要がありますが、子ローは常に親の直後にある必要があります。表のデータは、正しい順序でxxxは、QQQ、ZZZ、YYYになり、名前でソートされた、だから、親子ソート

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

の形式です。

データはLaravel/Eloquent ajaxクエリから得られ、datatablesテーブルに表示されるため、クライアント側またはサーバー側のいずれかでソートすると問題ありません。

(下記のコメント)常に他の列の前/後に、特定の列に発注適用する

+0

可能重複http://stackoverflow.com/questions/4582649/php-sort-array-by-two-field-値) – Henders

+0

これまでに試したことのコードを加えてください。 – Ruben

+0

ヘンダー:これはarray_multisortシナリオではありません。 array_multisortは複数の次元で順にソートします。 mysqlのorder byまたはdefaultのデータテーブルの動作によっても同じことができます。私は単純な1次元ソートが必要ですが、論理的なソート順にかかわらず、特定の行を一緒にまとめる必要があります(つまり、親に続くグループの子)。グループ別に並べ替えると、正しく動作するようになりますが、グループ単位でソートすることが望ましい結果になる場合に限ります。他の列で並べ替えることが問題です。 – deedoo

答えて

0

SQL、DataTablesのコールバック/ソート(プラグインは実行可能なオプションですが)、Eloquentコールバックまたは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; 
         } 
    
[2つのフィールドの値によってPHPのソート配列(の
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の前にあります。これは、逆名sort(y、x、z、q)の正しい順序ではありません。実際には、私は子オーダーを気にしません。親オーダーは鍵です。 – deedoo

関連する問題