2

Cakephp フレームワークを使用してアプリケーションを開発していますが、これらのモデル間の関連性を完全に理解するのに苦労しています。以下に、関連するデータベース フィールドとともに 4 つのモデルを示します。

User
 id

Profile
 id
 user_id

Post (A blog post on the users profile)
 id
 profile_id
 topic_id

Topic (A topic for a blog post)
 id
 name

現在の協会は次のとおりです。

User
 hasOne: Profile

Profile
 hasMany: Posts

Post
 belongsTo: Topic, Profile

今私の問題。のような関連付けを定義する必要があるのか​​ 、それとも と が原因でUser hasMany Posts既に想定されているのかはわかりません。私のもう 1 つの問題は、投稿とそのトピックの関係を定義することです。User hasOne ProfileProfile hasMany Posts

  • プロファイルには無制限の投稿を含めることができます
  • 投稿はプロフィールに関連付ける必要があります
  • 投稿には 1 つのトピックのみを含めることができます
  • トピック テーブルには、すべてのトピックのリストが含まれています
  • 投稿にトピックは必要ありません

これらの基準が与えられた場合、関連付けはどのように表示されますか? アソシエーションに関して私が行ったすべての調査は、単純な例のみを示しています。

CakePHP バージョン 2.1.3 を使用しています

事前にすべてのヘルプおよび/またはアドバイスをありがとう

4

2 に答える 2

2

アソシエーションのアソシエーションを再帰的に見つけることができます。さらに良いのは、Containableを使用することです。

モデル内(すべてにContainableを使用しているので、AppModelに配置することをお勧めします):

class AppModel extends Model {
    public $actsAs = array('Containable');
    ...
}

次に、おそらくコントローラーでユーザーの読み取り(または検索、ページ分割)を呼び出すときに、次のようにします。

$this->User->contain(array(
    'Profile' => array(
        'Post'
    )
));
$data = $this->User->read();
$set('user',$data);

そのデータをビューに設定すると、から投稿の1つのIDにアクセスできます$user['Profile']['Post'][0]['id']

次の質問では、条件付きの関連付けを行うことができます。

public $hasMany = array(
    'Topic' => array(
        'className' => 'Topic',
        'conditions' => 'Post.topic_id IS NOT NULL'
    )
)
于 2012-06-21T22:04:08.397 に答える
2

私はすべてがうまく見えると思う

ユーザー/投稿の関係を定義する必要はありません。ユーザーには多くの投稿がありませんが、プロフィールにはあります。profile_id ではなく user_id を Post に保存して、もう少し直感的にすることもできますが、それはあなた次第です。

Topic hasMany Post で完了です。説明するトピック/投稿条件は、フォームを介してモデルに保存する前に制御できます。たとえば、「投稿はプロファイルに関連付ける必要があります」など、ログインしているユーザーのセッション情報に基づいて profile_id に追加する投稿を保存する時点で十分です。

于 2012-06-21T23:00:29.007 に答える