質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

3回答

5519閲覧

CakePHPでテーブルのidを任意に設定し、連結したい

socha

総合スコア10

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

1クリップ

投稿2015/03/19 08:17

最近PHPおよびCakePHPを学習し始めた初心者です。
CakePHPにおいて、テーブルにauto_incrementのidフィールドではなく、任意のprimary_keyを設定することができるのでしょうか?
顧客コード番号や商品コード番号などを登録し、それらのコード番号を使ってテーブルを連結したいのですが、方法がわかりません。

顧客テーブル
|c_cd|c_name|
|1111|aaaaaa|
|2222|bbbbbb|

商品テーブル
|i_cd|i_name|c_cd|
|a001|book_a|1111|
|b002|book_b|2222|

このようなテーブルがあった場合、次のようなviewが欲しいのですが、

商品view
|i_cd|i_name|c_cd|c_name|
|a001|book_a|1111|aaaaaa|
|b002|book_b|2222|bbbbbb|

各テーブルにidフィールドを作成すれば、それぞれのadd、edit等の処理は問題なく動作します。
ところがidフィールドでは、テーブルを連結することができず、viewの$this->Form->input('id')でも表示されない場合があります。
任意のprimary_keyを指定しても、CakePHPが作成したSQLにはxxx_idが使用されてエラーとなります。
そもそもidというフィールドが必須なのかも分かりません。

上記のように任意のコード番号で管理しているケースは多いと思うのですが、検索しても的確なサンプルを見つけることができません。
どのようなテーブルを作成し、Model、Controller、Viewを作れば、上記の商品viewのような結果を得られるのか教えていただけませんか?

言葉足らずで質問の意図が充分に伝わっているかわかりませんが、どうかよろしくお願いします。

CakePHP 2.5.8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

lib/Cake/Model/Model.php:704 あたりに

lang

1 if ($this->primaryKey === null) { 2 $this->primaryKey = 'id'; 3 }

というコードがあります。
つまり各テーブルにおいて、明示的にプライマリキーを指定しない
(デフォルト)の場合、プライマリキーの項目名は 'id' とみなされます。

任意のプライマリキーを使いたい場合は、そのテーブルに対応する
Model の中で $primaryKey にプライマリキー項目名をセットします。
なお、プライマリキーは単一項目でなければならなかったと思います。

http://book.cakephp.org/2.0/ja/models/model-attributes.html#primarykey

実践的なサンプル欲しいですよねぇ。私も欲しいです(^_^)

投稿2015/03/19 11:23

hotta

総合スコア1613

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

socha

2015/03/19 12:17

hotta様、回答ありがとうございます。  $primaryKeyを明示すれば、プライマリキーを変更することができました。  これだと、viewで$this->Form->input('c_cd')とした時に、c_cdの入力欄が表示されない場合があるんです。  また、c_cdをキーにしてテーブルをJOINした時でも、CakePHPはidを探しているようなんです。  idを使用しない方法、またはidを使用してもうまくいく方法ってないのでしょうか?  私も、引き続き頑張って検索してみます。  お手数をお掛けしました。
guest

0

 terusu様、hotta様ありがとうございました。
おふたりの回答をヒントに、なんとかできそうです!

 やはり、各テーブルにidフィールドが存在しないと、いろんなところでエラーがでますので、idフィールドを追加することとしました。
そしてテーブルをJOINするときに、primaryKeyを設定することで、希望通りの結果を得ることができました。

顧客テーブル customers
|id|c_cd|c_name|
| 1|1111|aaaaaa|
| 2|2222|bbbbbb|

商品テーブル items
|id|i_cd|i_name|c_cd|
| 1|a001|book_a|1111|
| 2|b002|book_b|2222|

ItemsController.php

lang

1 public function index() { 2 $this->loadModel('Customer'); 3 $this->Customer->primaryKey = 'c_cd'; 4 $this->Item->primaryKey = 'c_cd'; 5 $this->Item->bindModel(array( 6 'hasOne' => array( 7 'Customer' => array( 8 'className' => 'Customer', 9 'foreignKey' => 'c_cd', 10 'fields' => array('c_name')))),false); 11 $this->set('items', $this->find('all')); 12 }

 これで正解なのかわりませんが、とりあえず私の環境で動作しましたので、解決とします。

投稿2015/03/20 10:30

編集2015/03/20 10:43
socha

総合スコア10

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

あまり質問の内容を理解していないのですが、とりあえず例に挙げておられるような結果を得たいのでしたら、

lang

1$params = array( 2 'joins'=>array( 3 array( 4 'table'=>'customers', 5 'alias'=>'Customer', 6 'type'=>'INNER', 7 'conditions'=>array( 8 'Customer.c_cd = Product.c_cd' 9 ) 10 ) 11 ), 12); 13$data = $this->Product->find('all',$params);

のようなコードを書けば、$dataに結果が入ります。
単一のモデル名でFormに渡したい場合は、いったん1つのモデルにデータを統合すればよろしいと思います。

lang

1foreach($data['Customer'] as $key=>$value){ 2 $data['Product'][$key] = $value; 3 unset($data['Customer'][$key]); 4} 5$this->request->data = $data;

lang

1$this->Form->create('Product'); 2$this->Form->input('c_cd');

あまり実践的なコードではありませんし、手打ちなので打ち間違いがあったら申し訳無いです。

ちょっとうろ覚えなのですが、いちいち結合しなくても、

lang

1$this->Form->create(); 2$this->Form->input('Customer.c_cd'); 3$this->Form->input('Product.i_cd');

のような書き方はできたかもしれません。
入力に必要無いカラムも、postしたい場合はhiddenなinputタグを作成しておく必要はあります。

投稿2015/03/20 05:42

terushu

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問