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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

CakePHP

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

Q&A

解決済

2回答

2035閲覧

cakePHP データベース リレーションシップの考え方

numa

総合スコア32

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

CakePHP

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

0グッド

1クリップ

投稿2015/11/19 04:50

現在cakePHPでデータベースを勉強中の者です.

こちらのサイトに掲載されている情報に沿ってデータベースの扱い方を勉強しているところです.
http://book.cakephp.org/2.0/ja/models/associations-linking-models-together.html#id2

まだこのページのbelongsToの項目までしか知識が無いのですが,私の理解度が乏しく,hasOneとbelongsToを1対1,多対1,と考える事に納得できません.
これら2つは対になっていて読み取る側と読み取られる側のどちらを基準に考えるかで使い分けると理解しています.なので私は基準が変わると1対1になったり,多対1になるという部分が腑に落ちません.

例えば[ユーザテーブル]と[プロフィールテーブル]があり,プロフィールテーブルに"user_id"という項目があったとします.

場合1)ユーザモデルからプロフィールテーブルの情報を読み取る際
ユーザモデルにはhasOneを記述(1対1)

これはユーザを基準にしていて,1つのユーザにつき1つのプロフィールがあると考えれば納得できます.

場合2)プロフィールモデルからユーザテーブルの情報を読み取る際
プロフィールモデルにbelongsToを記述(多対1)

これは基準がプロフィールになっていて,実際は場合1と同じく1つのプロフィールにつき1つのユーザのはず,なのでこの場合もユーザとプロフィールの関係は1対1だと思うのですが….

cakePHPだけがこの考え方なのでしょうか?
これらの分かりやすい例え方等があれば教えてください.

よろしくお願いいたします.

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

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

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

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

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

guest

回答2

0

この問題はテーブル同士を繋ぐためのキーに着目する必要があるようですね.

プロフィールテーブルにはuser_idというカラムがあり,1つのレコードに設定できるuser_idの値は1つですが,テーブル全体を見ればuser_idが同じ値のレコードは複数ある場合とそうでない場合があります.

それに比べてユーザテーブルのid列には(主キーなので当たり前ですが)同じ値はありません.

よってプロフィールテーブルのuser_idから辿ると1対1,もしくは多対1となります.
これはどちらの場合もユーザに属していると言えるのでbelongsTo(属す)を扱うことに問題はありません.

ユーザテーブルのuser_idから見れば1対1,もしくは1対多になります.
これはプロフィールを1つ持つ場合はhasOne,複数持つ場合はhasMany.と使い分ける必要があるようです.

投稿2015/11/19 06:31

numa

総合スコア32

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

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

0

ベストアンサー

userTable(親)
id(PK)
user_name
.
.
.

ProfilesTable(子)
id(PK)
user_id(FK)
.
.
.
の時、
親モデルが子モデルを引っ張る場合はhasOne(あるいはhasMany)
子モデルが親モデルを引っ張る場合はbelongsTo
です。

PHP

1class User extends AppModel { 2 public $hasOne = array( 3 'Profile' => array( 4 'className' => 'Profile', 5 'conditions' => array('Profile.published' => '1'), 6 'foreignKey' => 'user_id', 7 'dependent' => true 8 ) 9 ); 10}

PHP

1class Profile extends AppModel { 2 public $belongsTo = array( 3 'User' => array( 4 'className' => 'User', 5 'foreignKey' => 'user_id' 6 ) 7 ); 8}

UserテーブルとProfileを繋ぐキーはProfileのuser_idであることを伝えないといけないのです。
Userモデルから見たら、hasOne(指定したクラスの方に参照するキーがあるよ)
Profileモデルから見たら、belongsTo(こっちに参照するキーがあるよ)
ってくらいの違いですね。

投稿2015/11/19 05:30

anonymouskawa

総合スコア856

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

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

numa

2015/11/19 05:59

回答ありがとうございます. 場合2についてですが, これまでは1つのプロフィールが必ず1つのユーザに**属す**と考えていましたが, それではbelongsToの”属す”という捉え方では無く,hasOneの”持つ”という考えに近いことに気が付きました. ここでは,複数あるプロフィール情報は,各々がどれか1つのユーザに属している,と考えるとbelongsTo(属す)(多対1)で2つの情報を結び付けられる事にも納得です. また,場合1については,複数あるユーザ情報は,各々がどれか1つのプロフィールに**属す**,ではなく,1つのユーザは1つのプロフィールを**持つ**,と考えhasOneを用いる.と捉えれば両方に納得できました. 初めての概念だったので複雑に考えてしまいましたが,プログラム的にはそこまで考える事では無さそうですね.
anonymouskawa

2015/11/19 06:08

あっ、補足なのですが > 1つのユーザは1つのプロフィールを**持つ** 1つのユーザは1つのプロフィールを持っているか、あるいは持っていない。 というケースがあることを忘れないようにしてください。 cakePHPはこれらのリレーションの考えをプログラマ寄りのわかりやすく使えるようにしたものですが、DB設計者からすると「厄介な…」と思ってしまうFWでもあります。 ただ、まだcakePHPを学び始めたばかりというのであれば、複雑に考える必要はありません。使える機能はジャンジャン使いましょう!
numa

2015/11/19 06:37

まだまだcakePHPは初心者なので,これからどんどん機能を使っていく内にプログラム的な見方が出来るようになり,腑に落ちる考えに辿りつけるかも知れませんね! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問