Связь модели CakePHP hasOne/belongsTo

У меня есть несколько моделей, которые я пытаюсь связать.

Одна модель Item, одна Slide, а третья Asset.

Элементы имеют несколько слайдов под ними. Активы — это в основном файлы, которые были загружены (изображения, mp3-файлы и т. д.), а слайды — это места, где отображаются активы. У каждого слайда есть один ресурс, но данный ресурс может принадлежать нескольким слайдам. Для слайда определено поле asset_id.

В настоящее время у меня есть модели, определенные как:

Слайд

class Slide extends AppModel {
    var $name = 'Slide';

    var $order = array("Slide.order" => "asc");

    var $belongsTo = 'Item';

    var $hasOne = array(
        'Asset' => array(
          'className' => 'Asset',
            'foreignKey' => 'id',
            'dependent' => false
        )
    );

} // Slide class

Объект

class Asset extends AppModel {
    var $name = 'Asset';

    var $displayField = 'name';

    var $belongsTo= array(
        'Assetdir' => array(
            'className' => 'Assetdir',
            'foreignKey' => 'assetdir_id'
        ),
        'Slide' => array(
            'className' => 'Slide',
            'foreignKey' => 'id'
        )
    );  
} // Asset class

Когда я загружаю слайд, я вижу его родительский элемент Item в возвращаемых данных, а связанный с ним ресурс — нет. Что я здесь делаю неправильно?


person theraccoonbear    schedule 23.11.2011    source источник


Ответы (1)


На самом деле я думаю, что это отношение «один ко многим» между Slide и Asset. Со страницы ассоциаций моделей: ownTo: текущая модель содержит внешний ключ. Таким образом, любая модель, имеющая внешний ключ к другой, принадлежит другой.

Итак, как я это вижу:

Пункт:

  • Слайд hasMany

Горка:

  • принадлежит элементу (с item_id)
  • принадлежит активу (сasset_id)

Актив:

  • Слайд hasMany

Для получения связанных моделей, которые вы хотите, я предлагаю просмотреть Контейнерное поведение.

person brism    schedule 23.11.2011
comment
Отлично, спасибо. Я пришел к этому не с той стороны. Думаю, тогда я задаюсь вопросом, какими были бы отношения, где hasOne был бы уместным? - person theraccoonbear; 24.11.2011
comment
hasOne часто используется для разбиения данных на несколько таблиц. Например, у пользователя есть один Профиль. Все данные можно поместить в модель User, но их разделение позволяет сделать функциональность более детализированной. - person gapple; 24.11.2011
comment
hasOne лучше подходит для личных отношений. Пример, который они приводят на этой странице ассоциаций, — это Пользователь и его Профиль. У пользователя есть один профиль, и этот профиль принадлежит пользователю (поскольку он имеет внешний ключ user_id). - person brism; 24.11.2011