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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

CakePHP

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

Q&A

解決済

1回答

544閲覧

cakephp2 他のテーブルのレコードを使用

hiroki88

総合スコア66

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

CakePHP

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

0グッド

0クリップ

投稿2019/08/02 04:52

編集2019/08/02 07:30

mysql

1 2MySQL [cakephp_system]> select * from customers; 3+----+------+-----------+---------------+-----------+--------+---------------------+---------------------+---------------------+---------+ 4| id | name | line_type | contract_type | agency_id | status | contract_day | created | modified | deleted | 5+----+------+-----------+---------------+-----------+--------+---------------------+---------------------+---------------------+---------+ 6| 3 | 佐藤 | 0 | 0 | NULL | 0 | 2019-08-02 07:21:00 | 2019-08-02 07:21:06 | 2019-08-02 07:21:06 | 1 | 7| 4 | 伊藤 | 0 | 0 | NULL | 0 | 2019-08-02 07:21:00 | 2019-08-02 07:21:16 | 2019-08-02 07:21:16 | 1 | 8| 5 | 田中 | 0 | 0 | NULL | 0 | 2019-08-02 07:21:00 | 2019-08-02 07:21:26 | 2019-08-02 07:21:26 | 1 | 9+----+------+-----------+---------------+-----------+--------+---------------------+---------------------+---------------------+---------+

mysql

1MySQL [cakephp_system]> desc customers; 2+---------------+-------------+------+-----+---------+----------------+ 3| Field | Type | Null | Key | Default | Extra | 4+---------------+-------------+------+-----+---------+----------------+ 5| id | int(11) | NO | PRI | NULL | auto_increment | 6| name | varchar(50) | YES | | NULL | | 7| agency_id | int(11) | YES | | NULL | | 8| created | datetime | YES | | NULL | | 9| modified | datetime | YES | | NULL | | 10| deleted | int(11) | YES | | 0 | | 11+---------------+-------------+------+-----+---------+----------------+

mysql

1MySQL [cakephp_system]> desc agencies; 2+-------------+-------------+------+-----+---------+----------------+ 3| Field | Type | Null | Key | Default | Extra | 4+-------------+-------------+------+-----+---------+----------------+ 5| id | int(11) | NO | PRI | NULL | auto_increment | 6| agency_name | varchar(50) | YES | | NULL | | 7| created | datetime | YES | | NULL | | 8| modified | datetime | YES | | NULL | | 9| deleted | int(11) | YES | | 0 | | 10+-------------+-------------+------+-----+---------+----------------+

【やりたい事】
customersテーブルでagenciesテーブルのagency_nameカラムを使用したい。

とある課題をしており、テーブル作成に関しては指定があり上記の通り作成しました。

自分の予想はcustomersテーブルのagency_idカラムにagenciesテーブルのagency_name
カラムを当てはめると思っているのですが、どうしたら当てはめることができますか?
ちなみに各テーブルの操作はcakephpで行います。

使い方としてはcakephpのviewページでagenciesテーブルに新規の会社名を登録するとします。
MySQL [cakephp_system]> select * from agencies;
+----+--------------+---------------------+---------------------+---------+
| id | agency_name | created | modified | deleted |
+----+--------------+---------------------+---------------------+---------+
| 1 | ○○有限会社 | 2019-08-02 04:42:54 | 2019-08-02 04:42:54 | 1 |
| 2 | ○○株式会社 | 2019-08-02 04:43:07 | 2019-08-02 04:43:07 | 1 |
| 3 | ○○合同会社 | 2019-08-02 04:43:41 | 2019-08-02 04:43:41 | 1 |
| 4 | ○○合名会社 | 2019-08-02 04:43:52 | 2019-08-02 04:43:52 | 1 |
+----+--------------+---------------------+---------------------+---------+

続いてcakephpの別のviewページで誰がどこの会社に勤めているかを登録します。
そのデータをcustomersテーブルに保存します。
登録するときのviewページでagency_idカラム(会社名)のinputをプルダウン形式で選択できるようにしたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

要は下記のようなSQLが組めれば良いわけです。

sql

1select c.*,a.agency_name from customers c 2 inner join agencies a on c.agency_id = a.id

CakePHP2だとドキュメントは下記が参考になるのではないでしょうか。
アソシエーション: モデル同士を繋ぐ

その他参考記事
CakePHP2で複数のテーブルをJoinしてデータを取得・更新する際の基本
cakePHP2.1でJoinする

投稿2019/08/02 05:00

m.ts10806

総合スコア80850

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

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

hiroki88

2019/08/02 05:44

ご回答ありがとうございます。 この記事は読んだことがあり、$belongsTo、$hasOneを使用するんだろうなとは なんとなく理解しておりました。 ただそこからどうしたらよいかまだ理解しきれていません。 agency_nameとagency_idを合体させるのも、、、
m.ts10806

2019/08/02 05:45

回答の冒頭に書いたSQLは理解できますか?
m.ts10806

2019/08/02 05:46

念のため、プログラムからではなくDBに対して直接提示したSQLを実行してみてください。 それで欲しい情報が取れるか分かるはず。
hiroki88

2019/08/02 06:53

SELECT カラム名1, カラム名2, ... FROM テーブル名1 INNER JOIN テーブル名2 ON 結合の条件 冒頭は上記の意味ですよね?
hiroki88

2019/08/02 06:54

select c.*,a.agency_name from customers c inner join agencies a on c.agency_id = a.id をSQL内で実行してみればいいですか?
m.ts10806

2019/08/02 06:54

はい。 テーブル1(今回はcustomers)を主として agenciesのキーとなる情報(今回はid)と結合して情報を取得するやり方です。
m.ts10806

2019/08/02 06:56

> をSQL内で実行してみればいいですか? 「SQL内で」が何を指しているか分かりかねますが、質問本文でテーブルデータを出されてますので、 同じようにMySQLに直接ログインし、SQLを実行してみてください。
hiroki88

2019/08/02 07:08

実行してみましたが Empty set (0.00 sec) となりました。 ちなみにどちらのテーブルにも適当なレコードをいれてあります。
m.ts10806

2019/08/02 07:12

select * from customersの結果も質問本文に記載いただけますか? inner join は「結合可能な情報が必須」なので結合できなければレコードは取れないものです。
hiroki88

2019/08/02 07:21

MySQL [cakephp_system]> select * from customers; +----+------+-----------+---------------+-----------+--------+---------------------+---------------------+---------------------+---------+ | id | name | line_type | contract_type | agency_id | status | contract_day | created | modified | deleted | +----+------+-----------+---------------+-----------+--------+---------------------+---------------------+---------------------+---------+ | 3 | 佐藤 | 0 | 0 | NULL | 0 | 2019-08-02 07:21:00 | 2019-08-02 07:21:06 | 2019-08-02 07:21:06 | 1 | | 4 | 伊藤 | 0 | 0 | NULL | 0 | 2019-08-02 07:21:00 | 2019-08-02 07:21:16 | 2019-08-02 07:21:16 | 1 | | 5 | 田中 | 0 | 0 | NULL | 0 | 2019-08-02 07:21:00 | 2019-08-02 07:21:26 | 2019-08-02 07:21:26 | 1 | +----+------+-----------+---------------+-----------+--------+---------------------+---------------------+---------------------+---------+
hiroki88

2019/08/02 07:22

このようになっております。
m.ts10806

2019/08/02 07:22

質問編集して追記願います。 コメント欄ではマークダウン使えませんので
m.ts10806

2019/08/02 07:24

良く見たらagency_id はNULLになってるところですかね。 それはjoinしてもとれないわけです。 customersのagency_id にagencies のidをそれぞれ入れていく必要があります。 つまり、現状では当てはめようにもリンクする情報がないため当てはめられない ということです。
hiroki88

2019/08/02 07:30

customersのagency_id にagencies のidをそれぞれ入れていく必要があります。 というのはどうしたらよろしいでしょうか?
m.ts10806

2019/08/02 07:35

customersの登録時にagenciesのidを登録するようにすれば良いのではないでしょうか。
m.ts10806

2019/08/02 07:35

元々その入力と登録処理がないからnullになっているのでしょうから、その入力と登録処理を追加することになりますね。
hiroki88

2019/08/02 07:41

customersとagenciesは別々のコントローラとモデルで作成しているので、customersの登録時にagenciesのidを登録できるようにするには$belongsTo、$hasOneを使用してアソシエーションできるようにしないといけなですよね?
m.ts10806

2019/08/02 07:46

登録時にアソシエーションって必要なんでしょうか。 となるとそもそも、customers.agency_idとagencies.idで外部キー制約を貼っておく必要があります。 でないとアプリケーションとDBで設定のずれがあることになりますので。 ただ既にNULLが入っている状態なので外部キー制約を後から貼るのはできないでしょうけど。 とりあえず、登録の際の入力コントロールと登録処理は追加必要として、 customers.agency_idにagencies.idを手動(update文で良いですけど)で入れられてはどうでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問