[CakePHP] 데이터 베이스(MariaDB(Mysql))를 연결하는 방법


Study/PHP  2019. 10. 8. 09:00

안녕하세요. 명월입니다.


이 글은 CakePHP에서 데이터 베이스(MariaDB(Mysql))를 연결하는 방법에 대한 글입니다.


예전에 제가 CakePHP가 아닌 직접 mysqli 확장 모듈을 이용해서 데이터를 가져오는 방법에 대해 소개한 적이 있습니다.

링크 - [PHP] 데이터 베이스(mariaDB)를 연결해서 사용하는 방법


CakePHP에서는 데이터 베이스를 더 쉽게 접속하고 데이터 관리가 좀 더 편합니다. 느낌으로는 C#의 Linq와 비슷한 느낌입니다.

링크 - https://book.cakephp.org/3.0/en/orm/database-basics.html


먼저 데이터 베이스에 쿼리를 만들고 데이터를 준비합니다.

저는 이전에 사용하던 것 그대로 사용할 생각입니다.

그리고 데이터 베이스 접속 정보를 설정해야 합니다.


Cake 프레임워크에서 config 폴더 안에 App.php 파일이 있습니다. App.php 파일 중간에 보면 데이터 베이스 커넥션 정보를 입력하는 부분이 있습니다. 설정한 환경에 맞게 수정해서 넣으면 됩니다.

데이터 베이스 설정이 완료가 되었으면 실제 HomeController에서 디비의 testtable 데이터를 취득해 오겠습니다.

<?php
namespace App\Controller;

use Cake\Datasource\ConnectionManager;

class HomeController extends AppController{
  public function index(){
    $connection = ConnectionManager::get('default');
    $results = $connection->execute('SELECT * FROM testtable')->fetchAll('assoc');
    // array 타입으로 row는 일반 배열 형식으로 들어가고 각 컬럼 별 데이터는 연관 배열로 들어 갑니다.
    // 즉 위 query에서 4개의 데이터는 각각 $results[0] , $results[1]로 가져올 수 있고 각 컬럼의 데이터는 $results[0]['idx'], $results[0]['data']로 가져올 수 있습니다.
    $this->set("testtable", $results);
  }
}
{foreach from=$testtable item=entity}
{$entity["idx"]}  {$entity["data"]}
{/foreach}

데이터를 보면 데이터를 확실히 가져온 것을 확인할 수 있습니다.


여기까지 위 쿼리를 보면 단순하게 select * from testtable식을 날려서 assoc로 연관 배열로 취득한 것으로 크게 이전 방식이랑 달라 보이는 게 없네요.

<?php
namespace App\Controller;

use Cake\Datasource\ConnectionManager;

class HomeController extends AppController{
  public function index(){
    $connection = ConnectionManager::get('default');
    $query = $connection->newQuery();
    // C#의 Linq와 Java의 Stream식처럼 표현이 가능합니다.
    $results = $query->from('testtable')->where(['idx >' => 2])->order(['idx' => 'DESC'])->select('*')->execute()->fetchAll('assoc');
    $this->set("testtable", $results);
  }
}

위 소스를 보면 $connection으로 부터 query값을 가져와서 from, where, order, select 함수를 써서 쿼리를 작성합니다. 이 쿼리 함수들은 순서가 바뀌어도 됩니다.

최종 execute를 하고 fetchAll로 데이터를 가져옵니다.

<?php

namespace App\Controller;

use Cake\Datasource\ConnectionManager;

class HomeController extends AppController
{
  public function index()
  {
    $connection = ConnectionManager::get('default');
    // testtable의 데이터를 전체 삭제한다.
    $connection->delete('testtable');
    // testtable에 data를 insert한다.
    for ($i = 0; $i < 10; $i++) {
      $connection->insert('testtable', ["data" => "data " . $i]);
    }
    // testtable의 홀수는 삭제한다.
    $connection->delete('testtable',['idx%2' => 1]);
    // testtable의 10의 단위로 떨어지는 값은 data를 new로 바꾼다.
    $connection->update('testtable', ["data" => "new!!!"] , ['idx%10' => 0]);

    $query = $connection->newQuery();
    $results = $query->from('testtable')->where(['idx >' => 2])->order(['idx' => 'DESC'])->select('*')->execute()->fetchAll('assoc');
    $this->set("testtable", $results);
  }
}

위의 식은 insert 할 떄, 앞은 테이블 명, 그 뒤는 연관 배열을 생성해서 데이터를 넣습니다. delete나 update도 연관 배열로 검색 및 수정을 하네요.

여기까지 생각해보면 PHP의 ORM 프레임워크는 연관 배열과 관계가 깊은 것을 알 수 있습니다. Java나 C#처럼 Entity 클래스에서 get set으로 데이터를 정하는 것이 아니고 연관 배열로 데이터를 담고 다루는 듯합니다.

그래서 Entity와 Table 클래스에 대해서도 조사가 필요하네요..

링크 - [CakePHP] CakePHP ORM의 Query식과 Entity, Table 클래스, Resultset


여기까지 CakePHP에서 데이터 베이스(MariaDB(Mysql))를 연결하는 방법에 대한 글이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.