【SQL】Join 時にエラーが表示される
Join時に下記のようなエラーが表示されて困りました。
エラーが出ていると言っても、Joinは成功している様子。データもちゃんと取れてきています。しかしこのエラーは困る。
ひとまず、dbo_source.phpの1267あたりを見てみる。
上記内この部分
にてエラーが出ている模様。ひとまずこの条件式を全てコメントアウトしてみました。すると…?
エラーが消えた…。
うーん、一切解析してないけど、いいのかなぁ。ひとまずこのまま行ってみよう。
Notice (8): Undefined offset: 0 [CORE/cake/libs/model/datasources/dbo_source.php, line 1267]
DboSource::buildStatement() - CORE/cake/libs/model/datasources/dbo_source.php, line 1267
DboSource::generateAssociationQuery() - CORE/cake/libs/model/datasources/dbo_source.php, line 1072
DboSource::read() - CORE/cake/libs/model/datasources/dbo_source.php, line 652
Model::find() - CORE/cake/libs/model/model.php, line 2045
PagesController::display() - APP/controllers/pages_controller.php, line 22
Object::dispatchMethod() - CORE/cake/libs/object.php, line 117
Dispatcher::_invoke() - CORE/cake/dispatcher.php, line 226
Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 193
[main] - APP/webroot/index.php, line 87
エラーが出ていると言っても、Joinは成功している様子。データもちゃんと取れてきています。しかしこのエラーは困る。
ひとまず、dbo_source.phpの1267あたりを見てみる。
if (!empty($query['joins'])) {
$count = count($query['joins']);
for ($i = 0; $i < $count; $i++) {
if (is_array($query['joins'][$i])) {
$query['joins'][$i] = $this->buildJoinStatement($query['joins'][$i]);
}
}
}
上記内この部分
$query['joins'][$i] = $this->buildJoinStatement($query['joins'][$i]);
にてエラーが出ている模様。ひとまずこの条件式を全てコメントアウトしてみました。すると…?
エラーが消えた…。
うーん、一切解析してないけど、いいのかなぁ。ひとまずこのまま行ってみよう。
Controllerで複数Modelを使用した際、Updateが上手くいかない現象
CakePHPにはアプリケーションの基本であるinsert、Updateを(テーブル定義さえ規約に沿った作りになっていれば)自動で行ってくれる素晴らしい機能があります。
例えば掲示板を作ったとして、プライマリーキーであるidが存在しなければinsert、存在すればupdateとCakePHPの中の人が勝手に判断してくれるのです。頭が良い。
しかし、通常modelと1テーブルが一対になっているのにcontrollerで「複数model(複数テーブル)を使いますよ」と宣言してしまうと、どうにもCakePHPの中の人が混乱してしまい、『は?どのモデル?わかんなし』となり『とりあえずinsertしとけばいいんじゃね?』とupdate処理をしてくれません。しかもinsertもデータが空のまま行ってしまう慌てっぷりです。
【controllerで複数テーブル指定】
しかしこれは中の人が悪いわけではなく、こっちで勝手に複数指定しておきながらデータ処理するmodelを明示していない方が悪いのです。以下のように処理するmodelを記載してあげましょう。
【controller内、データをinsertあるいはupdateするためのソース】
以上です。
例えば掲示板を作ったとして、プライマリーキーであるidが存在しなければinsert、存在すればupdateとCakePHPの中の人が勝手に判断してくれるのです。頭が良い。
しかし、通常modelと1テーブルが一対になっているのにcontrollerで「複数model(複数テーブル)を使いますよ」と宣言してしまうと、どうにもCakePHPの中の人が混乱してしまい、『は?どのモデル?わかんなし』となり『とりあえずinsertしとけばいいんじゃね?』とupdate処理をしてくれません。しかもinsertもデータが空のまま行ってしまう慌てっぷりです。
【controllerで複数テーブル指定】
$uses = array('Model1', 'Model2')
しかしこれは中の人が悪いわけではなく、こっちで勝手に複数指定しておきながらデータ処理するmodelを明示していない方が悪いのです。以下のように処理するmodelを記載してあげましょう。
【controller内、データをinsertあるいはupdateするためのソース】
//1つのmodelしか使わない場合はこれでOK
$this->Model1->save($this->data);
//2つ以上使う場合は明示する必要がある
$this->Model1->save($this->data['Model1']);
以上です。
CakePHPをインストールしたがCSSが読み込めない場合
CakePHPをインストールしてもCSSが読み込めない場合があります。これを解消する方法。
■apacheのhttpd.confに以下の記述を加える
【CakePHPのパス】には実際のパスを記述してください。
(例)
①Windowsの場合
C:\apache\htdocs\Cake
②Linuxの場合
/var/www/html/Cake
ご自身の環境に合わせて設定してくださいね。
以上です。
■apacheのhttpd.confに以下の記述を加える
<Directory "【CakePHPのパス】">
AllowOverride All
</Directory>
【CakePHPのパス】には実際のパスを記述してください。
(例)
①Windowsの場合
C:\apache\htdocs\Cake
②Linuxの場合
/var/www/html/Cake
ご自身の環境に合わせて設定してくださいね。
以上です。