Чтение / удаление связанных данных /entites в Lithium 0.11 и MongoDB
У меня есть модель Отпуск, которая имеет один объект маршрутов. У объекта "Маршруты" в качестве внешнего ключа есть значение 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. Документ Праздники создан в коллекции MongoDB на предыдущей странице и успешно сохранен. _Id передается основному интерфейсу на основе магистрали. При создании объекта "Праздники" объект "Маршруты" имеет нулевое значение (не добавляется / не сохраняется).
На следующей странице пользователь выбирает маршрут, и к контроллеру (saveitinerary) выполняется вызов AJAX/JSON, передавая значение__порта и массива объектов. Каждый объект представляет каждый день праздника.
Функция saveitinerary() извлекает текущий документ Holidays в $holiday, проверяет, имеет ли он "связанный" с ним объект "Маршруты", затем удаляет его и добавляет новый маршрут из нового опубликованного JSON.
ПРОБЛЕМЫ:
- Является ли $ отпуск-> Маршруты правильным способом проверки "соединенных" данных в модели "Праздники"?
1a. Является ли Itineraries::remove($holiday->Itineraries._id) правильным способом удаления существующего связанного объекта hasOne.
В настоящее время он всегда равен нулю, даже когда в базе данных объекты маршрутов создаются с праздничным_днем и другими атрибутами.
Похоже, что "созданных" отношений практически не существует, поскольку маршруты никогда не выбираются, даже если документы создаются в коллекции маршрутов (проверено с помощью оболочки MongoDB).
1 ответ
Отношения AFAIK не реализованы для MongoDb, что имеет некоторый смысл, так как это нереляционный Db, однако связывание - это обычная практика, и, как я смотрю в вашем примере, это то, что вы пытаетесь сделать, поэтому $hasOne, $hasMany и $ own работают только на RDB, таких как MySQL и т. д.
С другой стороны, Нейт Абеле опубликовал эту суть о том, как строить такие отношения один-к-одному и один-ко-многим. Может потребоваться некоторая настройка (DocumentArray был объединен с DocumentSet для начала), но он сделает эту работу.
Кричите, если вам нужна помощь с этим фрагментом.