BoardGroup.php 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. namespace App\Models;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Http\Request;
  6. use App\Models\DTO\SearchData;
  7. use App\Models\DTO\ResponseData;
  8. use Exception;
  9. class BoardGroup extends Model
  10. {
  11. protected $table = 'tb_board_group';
  12. protected $primaryKey = 'id';
  13. public $keyType = 'int';
  14. public $incrementing = true;
  15. public $timestamps = true;
  16. const CREATED_AT = 'created_at';
  17. const UPDATED_AT = 'updated_at';
  18. const DELETED_AT = null;
  19. protected $guarded = [];
  20. public function board()
  21. {
  22. return $this->hasMany(Board::class);
  23. }
  24. public function boardGroupAdmin()
  25. {
  26. return $this->hasMany(BoardGroupAdmin::class);
  27. }
  28. public function boardGroupMeta()
  29. {
  30. return $this->hasMany(BoardGroupMeta::class);
  31. }
  32. /**
  33. * 게시판 그룹 조회
  34. */
  35. public function data(SearchData $params): object
  36. {
  37. $query = $this->query();
  38. $query->select(
  39. 'tb_board_group.*',
  40. DB::raw('(SELECT COUNT(*) FROM tb_board WHERE board_group_id = tb_board_group.id) AS boardRows'),
  41. DB::raw('(SELECT SUM(post_rows) FROM tb_board WHERE board_group_id = tb_board.id) AS postRows'),
  42. DB::raw('(SELECT SUM(comment_rows) FROM tb_board WHERE board_group_id = tb_board.id) AS commentRows')
  43. );
  44. if($params->keyword) {
  45. switch ($params->field) {
  46. case 'tb_board_group.code' :
  47. case 'tb_board_group.name' :
  48. case 'users.name' :
  49. case 'users.email' :
  50. $query->where($params->field, 'LIKE', "%{$params->keyword}%");
  51. break;
  52. case 'tb_board_group.id' :
  53. case 'users.id' :
  54. case 'users.sid' :
  55. $query->where($params->field, '=', $params->keyword);
  56. break;
  57. }
  58. }
  59. $query->orderBy('sort');
  60. $list = $query->paginate($params->perPage, ['*'], 'page', $params->page);
  61. $total = $this->count();
  62. $rows = $list->count();
  63. return (object)[
  64. 'total' => $total,
  65. 'rows' => $rows,
  66. 'list' => $list
  67. ];
  68. }
  69. /**
  70. * 게시판 그룹 등록
  71. */
  72. public function register(Request $request, ResponseData $response): ResponseData
  73. {
  74. DB::beginTransaction();
  75. try {
  76. $posts = $request->all();
  77. $id = (intval($this->all()->last()?->getKey()) + 1);
  78. $this->insert([
  79. 'id' => $id,
  80. 'code' => $posts['code'],
  81. 'name' => $posts['name'],
  82. 'sort' => $posts['sort']
  83. ]);
  84. (new BoardGroupMeta)->save($id, [
  85. 'pc_header_content' => $posts['pc_header_content'],
  86. 'pc_footer_content' => $posts['pc_footer_content'],
  87. 'mobile_header_content' => $posts['mobile_header_content'],
  88. 'mobile_footer_content' => $posts['mobile_footer_content']
  89. ]);
  90. DB::commit();
  91. } catch (Exception $e) {
  92. $response = $response::fromException($e);
  93. DB::rollBack();
  94. }
  95. return $response;
  96. }
  97. /**
  98. * 게시판 그룹 수정
  99. */
  100. public function updater(int $boardGroupID, Request $request, ResponseData $response): ResponseData
  101. {
  102. DB::beginTransaction();
  103. try {
  104. $posts = $request->all();
  105. $this->find($boardGroupID)->update([
  106. 'code' => $posts['code'],
  107. 'name' => $posts['name'],
  108. 'sort' => $posts['sort'],
  109. 'updated_at' => now()
  110. ]);
  111. (new BoardGroupMeta)->save($boardGroupID, [
  112. 'pc_header_content' => $posts['pc_header_content'],
  113. 'pc_footer_content' => $posts['pc_footer_content'],
  114. 'mobile_header_content' => $posts['mobile_header_content'],
  115. 'mobile_footer_content' => $posts['mobile_footer_content']
  116. ]);
  117. DB::commit();
  118. } catch (Exception $e) {
  119. $response = $response::fromException($e);
  120. DB::rollBack();
  121. }
  122. return $response;
  123. }
  124. /**
  125. * 삭제
  126. */
  127. public function remove(int $boardGroupID): mixed
  128. {
  129. return DB::transaction(function() use($boardGroupID) {
  130. $boardGroup = $this->findOrNew($boardGroupID);
  131. if($boardGroup->exists) {
  132. self::deleting(function($boardGroup)
  133. {
  134. // 게시판 그룹 관리자 삭제
  135. $boardGroup->boardGroupAdmin()->each(function($admin) {
  136. $admin->delete();
  137. });
  138. // 게시판 그룹 메타 삭제
  139. $boardGroup->boardGroupMeta()->each(function($meta) {
  140. $meta->delete();
  141. });
  142. // 게시판 삭제
  143. $boardGroup->board()->each(function($board) {
  144. $board->remove($board->id);
  145. });
  146. });
  147. $boardGroup->delete();
  148. }
  149. return true;
  150. });
  151. }
  152. }