2016-12-05 8 views
-1

私はちょうど数日前にcakePHPを学び始めました。それは私をたくさん混乱させます。私が最初からプロジェクトを書く場合、私のシステムでは、ユーザーと各ユーザーが1つのプロファイルを持つと言うことができます。だから私はこのようなデータベーステーブルを作成します:データベースとフレームワークの理解に誤りがありますか?

+----+----------+----------+------------+ 
| id | username | password | profile_id | 
+----+----------+----------+------------+ 
| 1 | ksno  | ksno  |   1 | 
| 2 | cake  | bake  |   2 | 
+----+----------+----------+------------+ 

+----+-----------+----------+---------------+ 
| id | firstname | lastname | birthday | 
+----+-----------+----------+---------------+ 
| 1 | Alex  |   | in few months | 
| 2 | cake  | PHP  |    | 
+----+-----------+----------+---------------+ 

そして、私はユーザーからプロファイルエンティティを作成することができました。問題は、私はプロファイルを最初に作成する必要があります、なぜなら、テーブルユーザーはプロファイルの外部キーを持っているからです。さて、トランザクションを開始し、すべてが正常に作成されたらコミットします。私はcakePHP docs and bookを見てみるならばそれは...私はそれを学んだか

です。しかし:

表が外部キーが含まれている場合、それは他の表に属しています。

これは基本的には...ユーザーはプロフィールに属していますか?しかし、それはしません。私は、ユーザーとそのプロフィールに関する私のCRUDアクションでほぼ完了しています....しかし、私は何か間違っているように感じています...本の後ろに...私たちはエンティティとその関連を次のようにフォームから救うことができます:

$entity = $users->newEntity($this->request->data(), [ 
    'associated' => [ 
     'Profiles' => ['validate' => false], 
    ] 
]); 

しかし、私はプロファイルIDを持つことなく、ユーザを保存最初カントので、それはだから私はこれを行っていた...、何が起こっているかを誤解するように私につながる私のデータベーススキーマを変更する必要があります。

$userProfilesRepository = TableRegistry::get('UserProfiles'); 
$userProfile = $userProfilesRepository->newEntity(); 
$userProfile = $userProfilesRepository->patchEntity($userInfo, $this->request->data); 
$user = $this->Users->patchEntity($user, $this->request->data); 
if ($userProfilesRepository->save($userInfo) && $this->Users->save($user->set('profile_id', $userInfo->get('id')))) {... 

誰かがデータベーススキームやフレームワークの関連性について正しい考え方を教えてくれますか?私は間違っているように感じるが、ただ私がcakePHPに苦しんでいるからだ。

+0

あなたのテーブルは合理的です。 CakePHPのようなフレームワークやオブジェクトリレーショナルマッパーを使用する他のフレームワークは、ネットワークデータモデルにあなたを強制します。 SQLでできることの多くは、このようなフレームワークではサポートされていません。制約の知識とそれらの間の翻訳能力が、直面している多くの問題を明確にする必要があるので、異なるデータモデル(ネットワーク、エンティティリレーションシップ、リレーショナル)を学習することをお勧めします。 – reaanb

+0

このようなフレームワークは私の開発ワークフローを何とか変更しますか?最初にERモデルを作成し、それに基づいてデータベースを作成してからcakePHPを学び、アプリケーションを作成しました。しかし、それは私が間違って思考していると感じるこの時点になります。私は他の方法で始めるべきですか?または、フレームワークと互換性があるようにデータベースを再設計するだけですか? – ksno

+0

私はずっと前に、オブジェクトリレーショナルマッパー(およびそれに依存するフレームワーク)をあきらめることに決めました。データモデリングとシステムモデリングは別々の分野です。私はシステムの責任のためのクラスを作り、セットでデータを扱うので、データをどのようにモデル化するかに制限はありません。残念ながら、私はあなたがフレームワークの中で働くのを助けることはできません。 – reaanb

答えて

0

あなたは逆の関係になっていると思います。 usersテーブルには、profile_idフィールドはありません。 profilesテーブルにuser_idフィールドが必要です。その後、プロファイルはユーザーに属しているため、おそらくあなたにとって理にかなっています。

+0

これは当てはまりますが、ユーザー 'hasOne'というプロファイルはプロファイル 'belongsTo'ユーザーではありません....ユーザーがプロファイルを持っている場合、プロファイルテーブルにFKを保存する理由どのユーザーに依存するのかを知っておく必要があります...ユーザーなしでプロファイルを作成する場合はどうすればよいですか?しかし、それでもすべてのユーザーにプロファイルが強制されます。それは私が混乱するものです。 – ksno

+0

Cakeに関しては、ユーザー 'hasOne'とプロファイルの 'belongsTo'ユーザーとは同じです。それは両側から見たのと同じデータベース構造です。プロファイルテーブルに 'user_id'をヌルにするだけで、ユーザなしでプロファイルを作ることができます。 –

+0

@ksno「ユーザーはどのプロフィールを知っているべきか」は誤った推論です。 *データベースの*ユーザーは知っている必要があります。関連するアプリケーションの関係は、「ユーザーIDには名前NAMEとパスワードPASSWORDがあります」、「プロファイルIDには実名FIRSTNAME LASTNAMEと生年月日BIRTHDATE」、「ユーザーUSER_IDにプロファイルPROFILE_IDがあります」があります。後者の2つを「プロファイルIDに実名FIRSTNAME LASTNAMEと生年月日BIRTHDATEがあり、ユーザーUSER IDにプロファイルIDがあります」という表に簡単に結合することもできますが、最初の2つを組み合わせるとNULLという複雑な意味があり、ただFK。 – philipxy

0

あなたはちょうどそれが関連を保存し、最初のユーザープロファイルを作成します

$userProfilesRepository = TableRegistry::get('Profiles'); 

    $data = [ 
     'firstname' => 'FOO', 
     'lastname' => 'BAR', 
     'user' => [ 
      'username'=>'foo', 
      'password'=>'bar' 
     ] 
    ]; // Dummy data 

$entity = $userProfilesRepository->newEntity($data, [ 
    'associated' => [ 
     'Users' => ['validate' => false], 
    ] 
]); 

をユーザープロファイルを保存し、それをユーザーに関連付ける必要があります。 これでクリアされることを願っています。

0

ORMは問題があり、リレーショナルモデルを取得しません。それでも、あなたのデータベースを設計するには、をORMの「関係」[sic]で記述します。 「所属」は宣言の単なる名前です。このような名前の選択は、弱いERエンティティタイプ(おそらくは関連性のある)が、それが所属する別の「所有している」エンティティタイプのPKに対するPKにFKを持つサイトタートンからインスピレーションを受けています。あなたが望むところにFKを置く宣言だけを使用してください。スペルを心配しないでください。

(あなたは別のテーブルのスキーマにだけある、それに対応するテーブルのための計算列を説明するものとして、いくつかの記録/モデルの宣言と考えることができます。)

をデザイン再:ERがconceredされる限り、ユーザーが持ちますオプションのプロファイルは、プロファイルが弱いエンティティであり、FKを持つ弱いエンティティであることを「推薦する」ユーザーに示します。しかし、あなたはのnull可能なプロファイルFKをユーザに持っていると考えています。すべてのプロファイルがまったく1人のユーザのFKとして表示されるという制約が必要です。これは不必要に複雑な設計です。シンプルな設計は、FKをプロファイルテーブルに置くことです。これは、「プロファイルはユーザに属します」と同意します。

関連する問題