データベースの接続時は問題なかった
データベースはMySQLを使用しており、データベース名**「datebase-b」**(仮)のようにしていました。CakePHPを使用しており、接続時は問題ありませんでした。
app.php
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
'username' => 'user_a',
'password' => 'password',
'database' => 'database_a',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'log' => false,
],
'test' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
'username' => 'user_b',
'password' => 'password',
'database' => 'database-b',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'log' => false,
],
],
SQL文でエラーになった
今回はポータルサイトであったため、複数のデータベースが存在します。「datebase_aのusersテーブル」と「datebase-bのcommentsテーブル」をjoinする際にSQL文でエラーが発生しました。(usersテーブルとcommentsテーブルを別のデータベースで管理するのはあくまで例です)
下記はCakePHPです。
test.php
$users = $this->Users->find()
->join([
'table' => 'datebase-b.comments',
'alias' => 'C',
'type' => 'LEFT',
'conditions' => 'C.user_id = Users.id',
])
->toArray();
これでsyntax errorになりました。
ちなみにCakePHPを使った複数の接続方法を知りたい方はこちらの記事をご覧ください。
解決方法はエスケープ
ハイフン(-)が悪さをしていたみたいです。SQL文でデータベース名をエスケープ(``)したら動きました。
test.php
$users = $this->Users->find()
->join([
'table' => "`portal-oem`.comments",
'alias' => 'C',
'type' => 'LEFT',
'conditions' => 'C.user_id = Users.id',
])
->toArray();
データベース名はよく使うと思うので、定数にしておきましょう。
const.php
define("B", '`database-b`');
test.php
$users = $this->Users->find()
->join([
'table' => B.".comments",
'alias' => 'C',
'type' => 'LEFT',
'conditions' => 'C.user_id = Users.id',
])
->toArray();
データベース名で記号を使うときは、有効か一度確認した方が良いですね。