CakePHP 配列やオブジェクトをデータベースに保存する

MySQLなどRDBのデータベースには整数や文字列など様々な型を収納できますが、配列やオブジェクトを保存する際にはそのまま保存することができません。
CakePHPでは標準の機能で配列などの複雑な型のデータをシリアライズして保存してくれる機能があります。
この機能を使うことで、データベースからデータを取り出したときは勝手にアンシリアライズしてくれるので、
簡単に配列などをデータベースに格納して扱うことができます。

コード例は公式サイトから持ってきました。

// 3.6 より前では、 config/bootstrap.php で型マップを追加する必要があります。

use Cake\Database\Type;

Type::map('json', 'Cake\Database\Type\JsonType');

// src/Model/Table/UsersTable.php の中で
use Cake\Database\Schema\TableSchema;

class UsersTable extends Table
{
    protected function _initializeSchema(TableSchema $schema)
    {
        $schema->setColumnType('preferences', 'json');

        // 3.6 より前では、 ``setColumnType`` の代わりに ``columnType`` を使用してください。
        $schema->columnType('preferences', 'json');

        return $schema;
    }
}

上の例ではpreferencesをjsonカスタムタイプにマップして保存します。取り出す際はjsonから配列にアンシリアライズされて扱うことができます。

$user = new User([
    'preferences' => [
        'sports' => ['サッカー', '野球'],
        'books' => ['マスタリング PHP', 'ハムレット']
    ]
]);
$usersTable->save($user);

保存する際は勝手にjsonにして保存してくれるので保存も簡単です。
配列などを保存することができるのは便利ですが、しっかりと型チェックなどバリデーションを行わないと脆弱性につながるので気をつけましょう