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 (追加/保存されていない) です。
次のページで、ユーザーが旅程を選択すると、コントローラー (saveitinerary) に対して AJAX/JSON 呼び出しが行われ、休日_id とオブジェクトの配列が渡されます。各オブジェクトは、休日の各日を表します。
saveitinerary() は $holiday で現在の休日ドキュメントを取得し、それに「関連する」Itineraries オブジェクトの 1 つがあるかどうかを確認し、ある場合はそれを削除して、投稿された新しい JSON から新しい旅程を追加します。
問題:
- $holiday->Itineraries は、Holidays モデルで「結合された」データを確認する正しい方法ですか?
1a. Itineraries::remove($holiday->Itineraries._id) は、既存の hasOne 関連オブジェクトを削除する正しい方法ですか。
現在、データベースで Itineraries オブジェクトが holiday_id やその他の属性で作成されている場合でも、常に null として出力されます。
Itineraries コレクションでドキュメントが作成されているにもかかわらず、Itineraries が取得されないため、「作成された」関係はほとんどないように見えます (MongoDB シェルを使用して検証)。