0

これを行う方法のアイデアはありますが、適切な慣習のようには見えません。Submissionモデルとモデルがあり、Revisionそれぞれに似た名前のテーブルがあります。それぞれSubmissionに 1 つまたは複数Revisionの を関係で関連付けることができます$hasMany。したがってRevision、モデルには に$belongsTo戻る関係がありSubmissionます。

この関係を持つことに加えて、SubmissionモデルactiveRevisionには特定Revision$hasOneスタイルの関係への別の関連付け ( と呼ばれる) が必要です。ただし、この$hasOne型では外部キーがRevisionテーブルにある必要があります。私はそれをSubmissionテーブルに入れたいので、アクティブなものを見つけるためにすべてSubmissionのを照会する必要はありません。で関係をRevision指定するだけで目的が達成できることに気付きましたが、2 つのモデルが「互いに属している」ため、これは間違っていると感じています。$belongsToSubmission

これについてもっと良い方法はありますか?

4

1 に答える 1

1

関係の「命名」のため、あまり心配する必要はありません。Submissionテーブル内にRevisionの外部キーを保持することで、CakePHP、実際、'belongsTo' リレーションを作成したことになります。

厳密には「正しい」(?) 関係ではありませんが、この状況では、目的を達成するための簡単な方法のように見えます。別の投稿のリビジョンが現在のリビジョンとして設定されるのを防ぐために、リレーションに追加の条件を必ず追加してください。

 public $belongsTo = array(
     'Revision' => array(
         'conditions' => array(
             'Revision.submission_id = Submission.id',
         )
      )
 );

ただし、後の段階でコードを見ている場合 (または他の誰かが見ている場合) に混乱を避けるために、コードに適切なコメントを追加してください。(例: 「注: 維持しやすいため、begsTo リレーションを使用します)」

本当にhasOne リレーションに変換したい場合は、「リビジョン」テーブルに追加の列を追加する必要があります。たとえば、「is_curreny_revision」です。ただし、提出物の1 つのリビジョンのみを現在のリビジョンに設定できることも確認する必要があります。

PostgreSQL を使用している場合、これは「部分一意」インデックスを使用して実現できます (StackOverflow に関するこの質問を参照してください; PostgreSQL: 条件付き一意制約)。MySQL は部分インデックスをサポートしていないため、運が悪い

于 2013-04-26T20:59:12.703 に答える