Cakephp データベース
はじめてCakephpでデータベースのデータを扱いました。
いろいろと戸惑いましたので、まとめておきます。
データベース設定
config/app.phpにデータベース情報を入力します。
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => ホスト名,
'port' => ポート番号(必要に応じて),
'username' => ユーザ名,
'password' => パスワード,
'database' => データベース名,
'encoding' => 'utf8',
'prefix' => '',
'timezone' => 'Asia/Tokyo',
:
],
timezoneを「Asia/Tokyo」にする場合
Mysqlホームページから「timezone_posix.sql」をダウンロードし、下のコマンドでダウンロードしたファイルのsqlを実行します。
「mysql -u (ユーザー名) mysql -p < (timezone_posix.sql格納ディレクトリ)」
1.テーブルクラスの作成
src/Model/Tableディレクトリに作成します。
データベースへのインターフェースとなります。
Testsテーブルのテーブルクラスとして、
src/Model/Table/TestsTable.phpを作成します。
namespace App\Model\Table;
use Cake\ORM\Table;
class TestsTable extends Table {
}
テーブルオブジェクトは、
クラス名を小文字とアンダースコア区切りにした名前のテーブルを使用することになります。
上の例の場合、テーブルオブジェクトは「Tests」となります。
1-1.テーブル名の指定
テーブルクラス名が上の命名規則に従わない場合、initializeメソッドで使用するテーブルを指定します。
public function initialize(array $config) {
$this->setTable('tbl_test');
// 3.4 より前
$this->table('tbl_test');
}
1-2.主キーの指定
それぞれのテーブルには、id列があり主キーであることになっています。
主キーがid列でない場合、initializeメソッドで主キーを指定します。
public function initialize(array $config) {
$this->setPrimaryKey('no');
// 3.4 より前
$this->primaryKey('no');
}
1-3.エンティティクラスの指定
テーブルオブジェクトの命名規則に従ったエンティティクラスを使います。
テーブルクラスが「TestsTable」だとエンティティクラスは「Test」になります。
命名規則に従わない場合は、initializeメソッドでエンティティクラスを指定します。
public function initialize(array $config)
{
$this->setEntityClass('App\Model\Entity\Testttest');
// 3.4 より前
$this->entityClass('App\Model\Entity\Testttest');
}
また、エンティティクラスをカスタマイズしたい場合のみ、エンティティクラスを作る必要があります。
2.テーブルインスタンスを取得
テーブルにクエリを実行する前に、テーブルインスタンスを作成します。TableRegistryクラスを使って取得します。
コントローラーやテーブルのメソッドにて
use Cake\ORM\TableRegistry;
$tests = TableRegistry::get('Tests');
3.クエリー実行
クエリを実行するとエンティティオブジェクトとして、それぞれのレコードを取得することができます。
3-1.findメソッド
findメソッドですべてのデータを取得を指定します。(クエリはまだ実行されません)
$query = $tests->find('all');
3-2.allメソッド
allメソッドはクエリを実行し結果セットを返します。
$results = $query->all();
3-3.結果セットを配列として取得
結果セットがあれば すべての行を配列として取得します。
$data = $results->toArray();
3-4.コントローラーからビューへ渡す
$this->set('list', $data);
3-5.ビューで出力
foreachなどを使って$listを出力します。
参考