Movie.php 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <?php
  2. namespace App\Models\Movie;
  3. use Illuminate\Database\Eloquent\Model;
  4. use Illuminate\Support\Facades\DB;
  5. use App\Models\DTO\SearchData;
  6. use App\Http\Traits\PagingTrait;
  7. use App\Http\Traits\CommonTrait;
  8. class Movie extends Model
  9. {
  10. use CommonTrait;
  11. use PagingTrait;
  12. protected $table = 'tb_movie';
  13. protected $primaryKey = 'id';
  14. public $keyType = 'int';
  15. public $incrementing = true;
  16. public $timestamps = true;
  17. const CREATED_AT = 'created_at';
  18. const UPDATED_AT = 'updated_at';
  19. const DELETED_AT = null;
  20. protected $guarded = [];
  21. public function list(SearchData $params): object
  22. {
  23. $where = $this->buildWhereQuery($params);
  24. $sql = sprintf("
  25. SELECT
  26. COUNT(*) AS total
  27. FROM tb_movie MVI
  28. WHERE TRUE %s;
  29. ", $where);
  30. $total = DB::selectOne($sql)->total;
  31. $sql = sprintf("
  32. SELECT
  33. MVI.*,
  34. MVD.main_img,
  35. (SELECT ROUND(AVG(`rate`), 1) AS rate FROM tb_movie_review WHERE movie_cd = MVI.movie_cd) AS rate
  36. FROM tb_movie MVI
  37. LEFT JOIN tb_movie_detail MVD ON MVI.movie_cd = MVD.movie_cd
  38. WHERE TRUE %s
  39. ORDER BY
  40. MVI.open_dt DESC
  41. LIMIT ?, ?;
  42. ", $where);
  43. $list = $this->getPaginator(
  44. DB::select($sql, [$params->offset, $params->perPage]),
  45. $total, $params->perPage, $params->page, $params->path
  46. );
  47. $rows = $list->count();
  48. return (object)[
  49. 'total' => $total,
  50. 'rows' => $rows,
  51. 'list' => $list
  52. ];
  53. }
  54. private function buildWhereQuery(SearchData $params): string
  55. {
  56. $where = "";
  57. if($params->keyword) {
  58. $where .= sprintf(" AND (MVI.movie_nm LIKE '%%%s%%' OR MVI.movie_nm_en LIKE '%%%s%%') ", $params->keyword, $params->keyword);
  59. }
  60. if($params->director) {
  61. $where .= sprintf(" AND JSON_UNQUOTE(JSON_EXTRACT(directors, JSON_UNQUOTE(JSON_SEARCH(directors, 'one', '%s')))) = '%s'", $params->director, $params->director);
  62. }
  63. if($params->type && is_array($params->type)) {
  64. $where .= sprintf(" AND type_nm IN(%s)", $this->setArraySingQuote($params->type));
  65. }
  66. if($params->genre && is_array($params->genre)) {
  67. $where .= sprintf(" AND rep_genre_nm IN(%s)", $this->setArraySingQuote($params->genre));
  68. }
  69. if($params->sYear || $params->eYear) {
  70. if($params->sYear) {
  71. $where .= sprintf(" AND prdt_year >= %d", $params->sYear);
  72. }
  73. if($params->eYear) {
  74. $where .= sprintf(" AND prdt_year <= %d", $params->eYear);
  75. }
  76. }
  77. if($params->sOpenDt || $params->eOpenDt) {
  78. if($params->sOpenDt) {
  79. $where .= sprintf(" AND open_dt >= %d", $params->sOpenDt);
  80. }
  81. if($params->eOpenDt) {
  82. $where .= sprintf(" AND open_dt <= %d", $params->eOpenDt);
  83. }
  84. }
  85. return $where;
  86. }
  87. public function isExists(string $movieCd): int
  88. {
  89. $sql = "
  90. SELECT IF(COUNT(*) > 0, 1, 0) AS isExists FROM tb_movie MVI JOIN tb_movie_info MVIO WHERE MVI.movie_cd = ?;
  91. ";
  92. return DB::selectOne($sql, [$movieCd])->isExists;
  93. }
  94. }