2

One Itineraries オブジェクトを持つ Holidays モデルがあります。Itineraries オブジェクトには、外部キーとしての holiday_id (Li3 規則によって暗示された) と、旅程の各日の情報を格納するオブジェクトの配列があります。Lithium 0.11 と MongoDB を使用しています。

  class Holidays extends \lithium\data\Model {

    public $hasOne = array('Itineraries'); 
}


   class Itineraries extends \lithium\data\Model {

    //Relationships
    public $belongsTo = array('Holidays');
}

コントローラ:

    public function saveitinerary()
{   

    $holidays_id = $this->request->data['holidays_id'];
    $holiday = Holidays::find($holidays_id, array('with' => 'Itineraries'));

    if($holiday->Itineraries)
    {
        Itineraries::remove($holiday->itinerary._id);   
    }

    //save the new itinerary data with added holidays_id as FK.
    $a = array('holidays_id' => $this->request->data['holidays_id'], 'Itineraries' => $this->request->data['itineraries']);

    $success = false;
    $itinerary = Itineraries::create($a);
    $success = $itinerary->save();
    if(!$success) 
        $log->LogDebug("Could not add itinerary for in db for holiday id:" . $holidays_id );
    return $itinerary->to('array');

イベントのシーケンスは次のとおりです。 1. Holidays ドキュメントが前のページの MongoDB コレクションに作成され、正常に保存されます。_id はバックボーン ベースのフロントエンドに渡されます。Holidays オブジェクトの作成時に、Itineraries オブジェクトが null (追加/保存されていない) です。

  1. 次のページで、ユーザーが旅程を選択すると、コントローラー (saveitinerary) に対して AJAX/JSON 呼び出しが行われ、休日_id とオブジェクトの配列が渡されます。各オブジェクトは、休日の各日を表します。

  2. saveitinerary() は $holiday で現在の休日ドキュメントを取得し、それに「関連する」Itineraries オブジェクトの 1 つがあるかどうかを確認し、ある場合はそれを削除して、投稿された新しい JSON から新しい旅程を追加します。

問題:

  1. $holiday->Itineraries は、Holidays モデルで「結合された」データを確認する正しい方法ですか?

1a. Itineraries::remove($holiday->Itineraries._id) は、既存の hasOne 関連オブジェクトを削除する正しい方法ですか。

  1. 現在、データベースで Itineraries オブジェクトが holiday_id やその他の属性で作成されている場合でも、常に null として出力されます。

  2. Itineraries コレクションでドキュメントが作成されているにもかかわらず、Itineraries が取得されないため、「作成された」関係はほとんどないように見えます (MongoDB シェルを使用して検証)。

4

1 に答える 1

2

AFAIK関係はMongoDbには実装されていません。これは非リレーショナルDbであるため、ある程度の意味がありますが、リンクは一般的な方法であり、あなたの例を見ると、それがあなたがやろうとしていることです. hasMany と $belongs は、MySQL などの RDB でのみ機能します。

一方、Nate Abele は、このような 1 対 1 および 1 対多の関係を構築する方法を記載した Gist を投稿しました。多少の調整が必要な場合があります (DocumentArray は最初に DocumentSet とマージされました) が、機能します。

そのスニペットについて助けが必要な場合は大声で言ってください。

于 2012-12-09T12:34:38.660 に答える