테이블 병합 혹은 테이블 조인을 쉽게 해 주는 기능인데 제대로 이해는 못 하고 쓰기에만 급급함.
종류가 네 가지 있는데, 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 : 알면 편하지만 모르면 일자무식인 것이 바로 프레임워크인가...ㅠㅠ
참고링크
댓글
댓글 쓰기