CakePHPの命名規約

CakePHPにはテーブルから始まって、モデル、コントローラー、ビューに至るまで命名規約があります。最初はなんだか縛りが多くてめんどくさいですが、逆にきちんと名前をつけてやることでCakePHPのいろいろな場面で自動認識してくれて、こんなに便利なのか~ということを後々体験することになります。

まずはデータベースのテーブル名、ここから始まります。

「lend_books」とします。ここに既に縛りがあり英語での「複数形」にしなければなりません。

モデル名
LendBook
モデルのファイル名
lend_book.php

コントローラー名
LendBooks
コントローラーのクラス名
LendBooksController
コントローラーのファイル名
lend_books_controller.php

ビューフォルダ名
lend_books
ビューのファイル名
lend_book.php

という形になります。

なかなか慣れるまでに苦労するかもしれませんね。

CakePHPにBakeというウィザード形式でテーブル名を基準にそれぞれのフォルダ、ファイルを自動生成する機能もあるのですが、逆になんでそうなっているのかを理解してからでないと変えてはいけないフォルダ名、ファイル名を変更してしまって思うように動かず泥沼へ・・・ということにもなりかねないのでまずは自分でフォルダを作って、ファイルを作って・・・と段階を踏んだ方が構造を変更する際にも役に立つことでしょう。

この記事を作成するときにたまたまとてもいいツールサイトが見つかったので
それも紹介します。
CakePHP 規約ワードメーカー WordMaker for CakePHP Conventions

キーワードを入力するとそれぞれどういう名前をつければいいのか?を一覧表示してくれます。これは便利ですね^^b。

cakephpでアソシエーションを複数設定する方法 その2

CakePHPで2つ、もしくは3つのテーブルを連動させてデータを引いてくる方法の備忘録。

「ユーザー(User)」→「本(Book)」→「貸出日(Day)」とテーブル連動させたいとします。

まずユーザーのモデルに

class User extends AppModel

public $name = ‘User’;
public $hasMany = ‘Book’;
(Bookモデル(テーブル)への「1:多」のアソシエーション)
public $recursive = 2;
(2段階(3つのテーブルを)アソシエーションをする場合に設定、2つの場合は不要)

と、設定します。そして次ぎは本のモデルに

class Book extends AppModel

public $name =’Book’;
public $hasOne = ‘Day’;
(Dayモデル(テーブル)への「1:1」のアソシエーション)

と、設定します。一番下の貸出日は特に特別な設定はいりません。

class Day extends AppModel

public $name = ‘Day’;

そして、「foreignKey」と呼ばれるテーブル同士を連動させるためのカラムを作成します。Userのモデル(テーブル)へ連動させるためにBookテーブルに「user_id」という名前のカラムを作成します。
これはCakePHPの名前の規則に従っており「Userテーブル」の「idカラム」に連動させているので「user_id」とアンダースコアで結び、このような名前付けをします。

同様にBookのモデル(テーブル)へ連動させるためにDayテーブルに「book_id」というカラムを作成します。

名前の規則に合っていればCakePHPが自動的に認識して関連付けを行ってくれます。

では、名前の規則に従えない場合はどうすればいいか?
実は

public $hasOne = ‘Day’;

これは省略形で、本来の形は

public $hasOne = array(
“Day” => array(
‘className’ => ‘Day’,
‘conditions’ => ”,
‘order’ => ”,
‘dependent’ => false,
‘foreignKey’ => ‘book_id’
)
);
が本来の形であり、きちんと条件を指定します。ここで先程出てきた「foreignKey」というものを指定します。何らかの理由で別のカラムに関連付けをしなければいけない場合はこのようにきちんと記述して指定します。

CakePHPでアソシエーションを複数設定する方法

CakePHPでアソシエーション(テーブルとテーブルの関連付け)を2段階で行い、次の次のデータも引っ張れるようにするにはモデルに「var $recursive =2;」のように設定します。

実際のコードの例として下記のようになります。

<?php

class User extends AppModel{

var $name = “User”;
var $recursive =2;

}

?>

デフォルト値は「recursive=1」(次ぎのアソシエーション)なので、何も記述がない場合は

「人」→「借りている本」

とアソシエーションして「人」に連動した「借りてる本」のデータが引けます。

ですが

「人」→「借りてる本」→「貸出日」と2段階でアソシエーションを設定した場合は

このままでは「借りてる本」までしかデータを引くことが出来ないので

「recursive=2」と設定し、次の次のデータも引くように設定すると

「人」→「借りてる本」(次)→「貸出日」(次の次)

とデータが引けるようになります。

CakePHPのりダイレクトがうまくいかない

CakePHPでリダイレクトと言って処理を行ったページから

もう一度処理を行ったページへ戻り

何度も同じ処理を行わせるために

リダイレクトという機能があるのだが

どうもうまく動いてくれない

検索で全てを検索する場合はいいのかもしれないが

条件を設定して検索して表示させたい場合に

一度目はちゃんと検索条件に従って表示してくれるが

リダイレクトで戻ってきたときに

条件が吹っ飛んでる・・・

嫌がらせ???・・・

今日はほっぽって寝ることしよっっ