Чтение / удаление связанных данных /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 передается основному интерфейсу на основе магистрали. При создании объекта "Праздники" объект "Маршруты" имеет нулевое значение (не добавляется / не сохраняется).

  1. На следующей странице пользователь выбирает маршрут, и к контроллеру (saveitinerary) выполняется вызов AJAX/JSON, передавая значение__порта и массива объектов. Каждый объект представляет каждый день праздника.

  2. Функция saveitinerary() извлекает текущий документ Holidays в $holiday, проверяет, имеет ли он "связанный" с ним объект "Маршруты", затем удаляет его и добавляет новый маршрут из нового опубликованного JSON.

ПРОБЛЕМЫ:

  1. Является ли $ отпуск-> Маршруты правильным способом проверки "соединенных" данных в модели "Праздники"?

1a. Является ли Itineraries::remove($holiday->Itineraries._id) правильным способом удаления существующего связанного объекта hasOne.

  1. В настоящее время он всегда равен нулю, даже когда в базе данных объекты маршрутов создаются с праздничным_днем и другими атрибутами.

  2. Похоже, что "созданных" отношений практически не существует, поскольку маршруты никогда не выбираются, даже если документы создаются в коллекции маршрутов (проверено с помощью оболочки MongoDB).

1 ответ

Отношения AFAIK не реализованы для MongoDb, что имеет некоторый смысл, так как это нереляционный Db, однако связывание - это обычная практика, и, как я смотрю в вашем примере, это то, что вы пытаетесь сделать, поэтому $hasOne, $hasMany и $ own работают только на RDB, таких как MySQL и т. д.

С другой стороны, Нейт Абеле опубликовал эту суть о том, как строить такие отношения один-к-одному и один-ко-многим. Может потребоваться некоторая настройка (DocumentArray был объединен с DocumentSet для начала), но он сделает эту работу.

Кричите, если вам нужна помощь с этим фрагментом.

Другие вопросы по тегам