データベース接続.

CakePHP3でMySQLに接続する.

前提事項.

  • MySQLでデータベースが作成済みであること.
  • 適当なテーブルが作成済みであること.
  • テーブルに紐付くModelクラスが作成済みであること.

app.phpでDB接続設定が完了していれば、作成可能なModelが表示される.

C:\xampp\htdocs\Cakephp>bin\cake bake model

Welcome to CakePHP v3.3.14 Console
---------------------------------------------------------------
App : src
Path: C:\xampp\htdocs\Cakephp\src\
PHP : 7.1.1
---------------------------------------------------------------
Choose a model to bake from the following:
- MCompanies

今回はMCompaniesテーブルに対してDB接続していく.

//Table、Entityクラス作成
cake bake model MCompanies

app.phpで接続先のデータベース指定

今回の場合、MySQLはrootユーザ、データベースはcakephpとする.

'Datasources' => [
    'default' => [
        'className' => 'Cake\Database\Connection',
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => 'localhost',
        'username' => 'root',
        'password' => '',
        'database' => 'cakephp',
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'flags' => [],
        'cacheMetadata' => true,
        'log' => false,

shell経由でデータベース接続

TestデータベースのテーブルSampleから全件取得するシンプルなロジック.

namespace App\Model\Table;

use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;

/**
 * MCompanies Model
 */
class MCompaniesTable extends Table
{

    /**
     * Initialize method
     */
    public function initialize(array $config)
    {
        parent::initialize($config);
        $this->table('m_companies');
        $this->displayField('id');
        $this->primaryKey('id');
        $this->addBehavior('Timestamp');
        $this->belongsTo('CreatedUsers', [
            'foreignKey' => 'created_user_id'
        ]);
        $this->belongsTo('ModifiedUsers', [
            'foreignKey' => 'modified_user_id'
        ]);
    }

    // 一部省略

    /**
     * 会社マスタ取得
     */
    public function getCompanies()
    {
        try {
            $query = $this->find();
            return $query->hydrate(false)->toArray();
        } catch (Exception $e) {
            // 例外対応
        }
    }
}

find時にはJSON形式で取得されるが、hydrate(false)->toArray()で配列形式に変換.

DB接続ロジック呼び出しは、loadModelで指定Tableクラスを呼び出す.

namespace App\Shell;

use Cake\Console\Shell;

/**
 * Test shell command.
 */
class TestShell extends Shell
{
    public function initialize()
    {
        parent::initialize();
        $this->loadModel('MCompanies');
    }
    
    public function db()
    {
        $companies = $this->MCompanies->getCompanies();
        $this->out($companies[0]['company_code']);
        $this->out($companies[0]['company_name']);
    }
}

実行結果は以下のようになる.

C:\xampp\htdocs\Cakephp>bin\cake test db

Welcome to CakePHP v3.3.14 Console
---------------------------------------------------------
App : src
Path: C:\xampp\htdocs\Cakephp\src\
PHP : 7.1.1
---------------------------------------------------------
10000
TestCompany

QueryString形式では、以下のように条件追加することが可能.

$query = $this->find();
$query->where(['is_deleted' => 0]);
$query->where(['id' => 1]);
$query->order(['start_data' => 'ASC']);

上記ではfind()で取得しているが、SQL直書きの方法でもデータ取得は可能.

Fin.