2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

Cakephp3 Association(테이블 병합)

테이블 병합 혹은 테이블 조인을 쉽게 해 주는 기능인데 제대로 이해는 못 하고 쓰기에만 급급함.
종류가 네 가지 있는데, 1:1(hasOne) 1:n(hasMany), n:1(belongsTo), n:n(belongsToMany) 임.

이 중에서 belongsTo 를 예시로 보자면..

1. Model (****Table.php) 의 initialize() 에 다음을 추가한다.
> courseTable.php
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('course');
        $this->setDisplayField('id');
        $this->setPrimaryKey('id');

        $this->addBehavior('Timestamp');

         $this->belongsTo('Section');
 // 옵션도 설정 가능
 // $this->belongsTo('Section', ['foreignKey' => 'section_idx']);
    }
하면 자동적으로 section 테이블과 병합이 된다. 여기서 주의해야 할 점은 첫째, 병합이 되는 테이블은 테이블과 엔티티 파일 (/Model/Table/****Table.php, /Model/Entity/****.php) 가져야 한다. 둘째, 주 키와 외래 키를 설정해야 한다. 설정하지 않는 경우에는, 병합되는 테이블명에 자동으로 언더바+id 가 붙고 그것이 외래키가 된다..즉,위의 경우에는 옵션을 안 주면 Section_id 필드가 자동적으로 외래키로 지정이 된다.또한, 조인 형태도 기본 Left Join 인 듯 싶다..Inner Join 등 가능한 듯 하나 현재는 필요 없으니 패스.

2. 컨트롤러에서 데이터를 불러온다..사용하는 방법은 여러가지인데 지금까지 파악한 건 두 가지다.
첫 번째는 contain을 이용하는 방법, 두 번째는 직접 핸들러로 접근하는 방법이다.
> courseController.php
// 다른 내용 생략하고
// 첫 번째 방법
        $course = $this->Course->get($id, [
            'contain' => ['Section']
        ]);
// 두 번째 방법
$sections = $this->Course->Section->find();

// 어느쪽도 set을 사용해서 뷰로 넘겨줘야 한다.
        $this->set(compact('course','sections'));
        $this->set('_serialize', ['course','sections']);

3. 뷰에서 사용한다.
> course.ctp
// 자잘한 거 다 생략하고..그냥 값을 찍을 땐 요렇게
<td><?= h($course->section->section_name) ?></td>
// 혹은 이런 식으로도 사용 가능하다.
<div class="form-group">
<div class="col-lg-12">
        <?= $this->Form->label('학부'); ?>
                <?php
                    echo $this->Form->select('section_idx',
                    ['options' => $sections],
                    ['empty' => '(학부를 선택해 주세요.)','class'=>'form-group','id' => "section_idx"]);
                ?>
</div>
</div>

신경이 쓰이는 건...편하게 한답시고 모든 필드를 다 가져와서 떠억! 하니 붙여버리기에 속도가 느리고 트래픽이 늘어나지 않을까 하는 걱정...불러올 필드만 선택적으로 명시해서 불러오는 방법이 있을 듯 한데 오늘은 귀찮음...ㅋㅋㅋ

4. 참조 : 선택 리스트 박스 만들 때..이전에 배열을 만들면서 데이터를 추가하여 그 녀석을 넘기는 방법이 있었는데 그런 거 안 해도 쉽게 만들 수 있는 방법이 있었다. find() 함수에 list라는 인자를 넘기면 예쁘게 리스트화 해서 넘겨준다. 거기에 키 값과 브라우저에 보여질 값도 별도로 설정할 수 있다. 메소드체인으로 조건문 나열한 후, 마지막에 toArray()로 배열화 하여 뷰로 넘겨주고 그 변수를 select form의 옵션으로 사용하면 자동으로 리스트 박스를 생성해준다.
> > courseController.php
$sections = $this->Course->Section->find('list', ['limit' => 200, 'keyField' => 'section_idx', 'valueField' => 'section_name'])
                                          ->Where(['section.is_used' => 1])
                                          ->toArray();

P.S : 알면 편하지만 모르면 일자무식인 것이 바로 프레임워크인가...ㅠㅠ

참고링크

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법