1

CakePHP でのモデルの関連付けについて頭を悩ませています。私は以前に OOP や MVC を扱ったことがなく、少し難しいと感じています。

ここに私が持っているものがあります:

Clubs

システム上のユーザーは「クラブ」です。クラブには、主要な連絡担当者を含むさまざまなフィールドがあります - clubs.club_primary_contact_id

Teams

クラブには、1 つまたは複数のチームを関連付けることができます。クラブと同様に、チームにも主要な連絡担当者 (teams.team_primary_contact_id) がいます。チームにもタイプがあり、タイプ テーブル team.type_id にリンクされています。team.club_id 経由でクラブにリンク

Contacts

クラブには、1 つまたは複数の連絡先を関連付けることができます。contact.club_id 経由でクラブにリンク

Types

types.id と types.type_name

clubs/view/x にアクセスして、次のようなページを表示できるようにしたい:

  • クラブの主な連絡先の名前/電子メール
  • すべてのクラブ連絡先
  • チームの主要な連絡先名/電子メールを含むすべてのクラブチーム

TeamsController の追加/編集/削除機能は正常に動作します。つまり、連絡先とタイプのリストを呼び出して、それらをビュー フォームの選択ボックスに表示できます。

ただし、クラブモデルからこれらすべてにきちんとアクセスするのに問題があります。

ここでの私の関連付けは何ですか? 現在、モデルクラスにあるものは次のとおりです。

アプリ/モデル/Club.php

public $hasMany = array(
    'Team' => array(
        'className' => 'Team',
        'foreignKey' => 'club_id'
    ),
    'Contact' => array(
        'className' => 'Contact',
        'foreignKey' => 'club_id',
        'order' => 'contact_name DESC'
        )
);

public $belongsTo = array (
    'ClubPrimaryContact' => array(
        'className' => 'Contact'
    )
);

アプリ/モデル/Team.php

public $belongsTo = array (
    'TeamPrimaryContact' => array(
        'className' => 'Contact'
    ),
    'Club',
    'Type'
);

アプリ/モデル/Contact.php

public $hasManyAndBelongsTo = array(
    'Team' =>
        array(
            'className' => 'Team'
        )
);

アプリ/モデル/Type.php

public $belongsTo = array (
    'Team' => array(
        'className' => 'Team'
    )
);
4

1 に答える 1

0

規則に固執することは、ここで少し役立ちます。

クラブを連絡先に所属させたい場合は、そのクラブにcontact_idを指定し、クラブモデルのbelongs_toリレーションをContactに設定します。そのリレーションに、Has_Manyリレーションエイリアスとは異なるエイリアスを指定する必要があります。たとえば、次のようになります。

public $belongsTo = array(
        'Leader' => array(
            'className'    => 'Contact'
        )
    );

チームの場合も同様に、エイリアスを持つリーダーのcontact_idでbelongs_toを定義し、連絡先の通常のhas_manyリレーションを定義します。

次に、クエリを実行するときに、すべての結果を取得するのに十分な高さの再帰を設定する必要があります。または、それが機能するようになったら、包含可能な動作でクエリを調整します。

次に、通常どおりにクエリを実行し、使用debug()して、返された配列構造を確認します。

于 2013-03-05T05:29:20.223 に答える