なんちゃって技術者のブログ -2ページ目

【SQL】Join 時にエラーが表示される

Join時に下記のようなエラーが表示されて困りました。


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で複数テーブル指定】
$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に以下の記述を加える

<Directory "【CakePHPのパス】">
AllowOverride All
</Directory>


【CakePHPのパス】には実際のパスを記述してください。

(例)
①Windowsの場合
C:\apache\htdocs\Cake
②Linuxの場合
/var/www/html/Cake

ご自身の環境に合わせて設定してくださいね。

以上です。