음음..


저는 기존 Model을 확장했습니다.


그래서 use App\Libraries\Model; 를 사용합니다.


확장을 안하셨다면 use CodeIgniter\Model; 로 사용하시면 됩니다.


코드이그나이터4 기본 모델에 상당히 괜찮은 코드들이 많이 있기 때문에 확장하셔서 사용하시면 괜찮습니다.

(귀찮아지는게 많이 있을뿐..)


기본 모델의 코드를 살펴보면, 코드이그나이터4는 테이블 하나당 하나의 모델이 할당된 느낌입니다.


실제로 그렇게 사용하는게 편하기도 하고..

(꼭 그렇게 안써도 됩니다. 매번 $this->setTable('테이블명'); 으로 테이블 바꿔줘야 한다는 불편함을 감수한다면..)


아마 저는 적당히 섞어서 쓸거 같은데..


추가적으로 DBA가 PK기준으로 DESC가 되어있는것을 기준으로 하는거 같습니다.


왜냐면 system/Model.php 을 보면, 함수중에 first() 는 존재하지만, last() 는 존재하지 않습니다.

(왜냐면 기본 오더바이가 DESC면 그냥 offset 0, limit 1로 가져올 수 있으니까..)


그리고 기본적으로 모두가 쓸만한 함수는 거의 만들어져 있습니다.


하나의 row를 가져오는 find() 함수라던가..


하나의 조건으로 where를 하는 findWhere() 함수라던가..


위에서 말한 offset 과 limit 만으로 DB를 가져오는 findAll() 함수라던가..


마찬가지로 위에서 말한 first() 함수..


insert와 update를 한방에 해결해주는 save() 함수..


insert(), update(), delete() 등등..


상당히 많은 함수가 구비되어있습니다.


그리고 보안도 상당히 잘 되어있..;;

(왜 보안이 잘 되어있는지는 나중에 서술..)



그래서 저는 application/Libraries/Model.php 에 코드이그나이터4 기본 모델을 확장하여 사용하고 있습니다.


본인의 깃허브에서 확인하면 아시겠지만, 필자는 코드이그나이터3때부터 쿼리는 그냥 하나의 모델에 때려박아서 배열로 넘겨주는 방식을 선호했어서;;


근데 코드이그나이터4는 모델쪽에서 자동으로 테이블을 셋가능하기 때문에..


매번 수작업으로 작성해야만 했던 코드들을 더이상 불편하게 안써도 상관이 없습니다.

(join과 같이 특별한 일이 있을때만 추가적으로 작성을 해야..)


모델에 함수를 하나 만들어 줍니다.


그리고 코드이그나이터4 기본 모델을 확장해줍니다.

(기본 모델을 확장한것을 불러오셔도 되고, 기본모델을 불러오셔도 됩니다.)


그러고 나서 해당 모델에 하나의 테이블을 셋팅할려면 약간의 변수 설정이 필요합니다.


protected $table = 'lotto';

protected $primaryKey = 'lotto_no';

protected $returnType = 'array';


일단 기본적으로 위의 변수를 설정해주셔야합니다.


전부다 직설적인 변수명이긴한데..


$table 변수는 DB 테이블 변수입니다.


$primaryKey 변수는 DB의 PK 입니다.

(유일값이 하나의 필드에 있을때 설정합니다.)


$returnType 기본값은 object 입니다.

(하지만 array로 반환받는걸 선호하시면 저처럼 array로 수정하시면 됩니다.)


위의 설정을 해주시면 일단 기본적인 DB 함수는 문제없이 사용이 가능합니다.


자동으로 테이블을 설정하고 자동으로 PK를 설정하고 자동으로 리턴을 설정하기 때문에..


find(PK); 로 함수를 사용하면 즉시 사용이 가능합니다.


예를들면, controller에서..


$this->lotto = new Lotto();
$this->lotto->find(1);


위의 3개 변수만 지정해줬을 뿐인데 PK로 하나의 row를 검색해서 데이터를 리턴받을 수 있습니다.


하지만 모든 함수들의 사용이 이렇게 쉬우면 이 게시글을 쓰고 있지 않겠죠..


기본 모델을 사용하는데에 있어서 주의사항이 있습니다.


$this->insert($data);


$data에 변수를 넣어서 insert를 그냥 해봅니다.


그러면 아래와 같은 에러가 등장합니다.



.. .. ..


기본 모델은 나름 보안(?)에 신경을 많이 썼기 때문에 위와 같은 에러가 등장합니다.



위의 에러를 없애기 위해서는 2가지 방법이 존재하는데..


하나는 위의 이미지처럼 $this->protectFields 변수를 false로 해주시면 insert/update가 정상적으로 작동합니다.


false로 하시면 테이블 필드 프로텍트를 사용하지 않겠다는 의미입니다.


만약 $this->protectFields 를 기본값인 true로 하면서 사용을 하고 싶으시다면, $this->allowedFields 변수에 필드명들을 입력하시면 됩니다.



위와같이 사용할 필드명들을 입력해주시면 됩니다.


저기에 변수가 이상하게 들어있으면 아래와 같은 에러가 뜹니다.



에러 내용은 그대로 set 내용이 없다는거..


재대로 넣어도 없어지는 이유는, 아무리 $data에 데이터를 배열로 넣어줘도, $this->protectFields 가 true인 이상, $this->allowedFields 의 배열에 없는 값들은 자동으로 삭제해주기 때문입니다.

(아마 부정 접근 방지용인거 같습니다.)


귀찮으면 protected $this->allowedFields = []; 로 테이블의 필드를 모두 선언하거나..

(해당 테이블의 필드명 리턴해주는 함수도 있기는 함..)


아니면 위에 명시한대로 그때그때 필요한 필드들만 넣어줬다가, insert/update후 다시 초기화 하는걸 보안적으로 보면 추천합니다.

(자동 초기화는 안하더군요.)


ps. 해당 에러가 왜 뜨나 고민을 했는데..

생각해보니까, 디버그바로 정확한 디버깅을 하려면, 각 섹션별 데이터를 다 들고 있어야;;

테스트용 데이터를 받아와서 DB에 때려박는 도중에 나온 에러입니다.

아무래도 insert가 300건이 넘어가니까 서버에 설정한 메모리가 못버텼네요..;;

(각 insert별 모든 데이터를 다 가지고 있어서;;)


ps2. 코드이그나이터4 설명서에서는 $builder->insert(); 나 $builder->update(); 를 하는데, 기본 모델과는 함수 변수 순서가 다릅니다.

이점 주의하셔야 합니다.


예를들면, 기본 모델의 update(); 함수의 경우..


앞의 변수가 PK, 뒤가 $data인데, $builder->update(); 해서 들어가는것의 경우는 앞이 $data, 뒤가 where절 입니다.

Posted by Pure Ani

RE:D Cherish! -Eternity Blood- CRYSTALiA

放課後シンデレラ2 HOOKSOFT

花鐘カナデ*グラム NanaWind

フタマタ恋愛 ASa Project

スタディ§ステディ2 ま~まれぇど

リンパにATATA! ~メス牡蠣ミルクどぴゅらっしゅ~ Hending

創作彼女の恋愛公式 Aino+Links

流星ワールドアクター Heliodor

Secret Agent~騎士学園の忍びなるもの~ ensemble

天冥のコンキスタ エウシュリー

HaremKingdom -ハーレムキングダム- SMEE

ラズベリーキューブ まどそふと

ノラと皇女と野良猫ハート2 -Nora, Princess, and Crying Cat.- HARUKAZE

『ノラと皇女と野良猫ハート2』応援中♪

ピュアソングガーデン PULLTOP

はにデビ! Honey&Devil eufonie

姫繰三六五 HIMEKURI365

姫繰三六五 公式ウェブサイト

はるるみなもに! クロシェット

死に逝く君、館に芽吹く憎悪 バグシステム

Sanguinea-サングイネア- すにぃる

麗華の館 しすたーそふと

カスタムメイドオンライン KISS