PHP/고도몰

고도몰5 Pro DBTableField 자동 생성

개발폐인 2023. 1. 14. 18:11

고도몰5 기능을 확장하다보면, 테이블을 추가해야 하는 경우가 생기는데,

\Component\Database\DBTableField.php 파일에 테이블 스키마를 구성해야 한다.

테이블 컬럼 형태에 맞춰서 $arrField 를 구성해야 하는데 이게 은근 귀찮은 작업이고,

실수하면 사이드 이펙트를 일으키고, 해당 오류를 찾기가 어렵다.

 

고도몰의 phpmyadmin 이 information_schema 를 참조할수 있도록 하고 있고,

테이블 스키마 정의는 infomation_schema db에 기록되어 있다.

이를 이용하여, 쿼리로 테이블에 대한 $arrField 생성하도록 해보았다.

 

set GROUP_CONCAT_MAX_LEN  = 10000000;
select concat('$arrField = [', group_concat('\n', concat('[', T3.val, ', ', T3.typ, ',', T3.def, ', ', '], //', comment)), '\n];') as result
FROM (
SELECT CONCAT('\'val\' => \'', COLUMN_NAME, '\'') AS val,
       CONCAT('\'typ\' => \'', type1, '\'') AS typ,
       CONCAT('\'def\' => ', default_val) AS def,
       COLUMN_COMMENT as comment
FROM (SELECT COLUMN_NAME,
             type1,
             (CASE
                  WHEN T1.COLUMN_DEFAULT IS NOT NULL AND type1 = 'i' THEN COLUMN_DEFAULT
                  WHEN T1.COLUMN_DEFAULT IS NOT NULL AND type1 <> 'i' THEN CONCAT('\'', COLUMN_DEFAULT, '\'')
                  ELSE 'null'
                 END) AS default_val,
                 COLUMN_COMMENT
      FROM (SELECT
                   (CASE
                        WHEN DATA_TYPE = 'int' THEN 'i'
                        WHEN DATA_TYPE = 'decimal' THEN 'd'
                        WHEN DATA_TYPE = 'json' THEN 'j'
                        ELSE 's'
                       END
                       ) AS type1,
                   COLUMN_NAME,
                   DATA_TYPE,
                   COLUMN_TYPE,
                   COLUMN_DEFAULT,
                   COLUMN_COMMENT
            FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_NAME = 'ex_goods_auction') T1
      ) T2
    ) T3
;

 

주의할점은 group_concat 사이즈가 작은 경우에 결과가 잘려질수 있으니, 반드시 group_concat_max_len 을 변경하고 실행.

FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'es_goods'

WHERE 조건절에 추가로 생성한 테이블명을 입력합니다. (es_goods 테이블을 테스트 해보았습니다.)

 

쿼리 실행 결과를 php 코드에 복붙하면 아래와 같이 출력되는걸 확인할수 있습니다.