RepositoryHasSortColumns.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. <?php
  2. namespace App\Traits;
  3. use App\Models\ColumnSort;
  4. use Illuminate\Support\Facades\Schema;
  5. trait RepositoryHasSortColumns
  6. {
  7. /**
  8. * 重写这个方法为了让DeviceRecord的字段能够以模型树展示
  9. * 为了做到字段排序,这个方法是展示到页面上的.
  10. *
  11. * @return array
  12. */
  13. public function toTree(): array
  14. {
  15. $array = [];
  16. $table_name = $this->getTable();
  17. // 排序表实中存在的字段
  18. $model_columns_array = ColumnSort::where('table_name', $table_name)
  19. ->orderBy('order', 'ASC')
  20. ->get(['name', 'order'])
  21. ->toArray();
  22. $model_columns = [];
  23. foreach ($model_columns_array as $model_column) {
  24. $model_columns = array_merge($model_columns, [$model_column['order'] => $model_column['name']]);
  25. }
  26. // 如果column_sorts表内没有该资产的字段排序数据,则全部新建
  27. // 数据库实际存在的字段+代码中自定义的字段
  28. $needle_columns = $this->sortNeedleColumns($table_name);
  29. if (!empty($model_columns)) {
  30. // 排序表中没有,但实际需要排序的字段
  31. $not_in_needle_columns = array_diff($needle_columns, $model_columns);
  32. $needle_columns = array_merge($model_columns, $not_in_needle_columns);
  33. }
  34. foreach ($needle_columns as $key => $needle_column) {
  35. $model = new $this->model();
  36. $model->id = $key;
  37. $model->title = admin_trans_field($needle_column);
  38. $model->parent_id = 0;
  39. $model->order = $key;
  40. array_push($array, $model);
  41. }
  42. usort($array, function ($a, $b) {
  43. return $a->order < $b->order ? -1 : 1;
  44. });
  45. return $array;
  46. }
  47. /**
  48. * 获取数据仓库对应模型的数据库表名.
  49. *
  50. * @return string
  51. */
  52. public function getTable(): string
  53. {
  54. return $this->model()->getTable();
  55. }
  56. /**
  57. * 对需要排序的全部字段进行排序.
  58. *
  59. * @param $table_name
  60. *
  61. * @return array
  62. */
  63. public function sortNeedleColumns($table_name): array
  64. {
  65. $needle_columns = Schema::getColumnListing($table_name);
  66. $needle_columns = array_merge($needle_columns, $this->model()->sortIncludeColumns);
  67. $needle_columns = array_values(array_diff($needle_columns, $this->model()->sortExceptColumns));
  68. $array = [];
  69. $return = [];
  70. foreach ($needle_columns as $key => $needle_column) {
  71. $column_sort = ColumnSort::where('table_name', $table_name)
  72. ->where('name', $needle_column)
  73. ->first();
  74. // 如果排序表中已经有这个字段了
  75. if (!empty($column_sort)) {
  76. // 往全部需要排序的字段中,指定位置,插入,排序的字段
  77. array_push($array, ['field' => $column_sort->name, 'order' => $column_sort->order]);
  78. } else {
  79. array_push($array, ['field' => $needle_column, 'order' => $key + 100]);
  80. }
  81. }
  82. $keys = array_column($array, 'order');
  83. array_multisort($keys, SORT_ASC, $array);
  84. foreach ($array as $item) {
  85. $return[$item['order']] = $item['field'];
  86. }
  87. return array_values($return);
  88. }
  89. }