2015-11-18 2 views
0

У меня есть следующие таблицы: 'assets', 'pictures', 'assets_pictures', 'othermodels', 'othermodels_pictures' и т.д ...CakePHP Два взаимосвязи между моделями

С выше, вы, вероятно, уже понял, что таблица 'pictures' служит хранилищем изображений и связана с нескольких моделей, в том числе «активов ».

Я хочу модель 'Asset' (таблица 'assets'), чтобы иметь:

  1. hasMany отношения с 'Picture' (используя таблицу 'assets_pictures')
  2. hasOne отношения с 'Cover' (таблица 'pictures'), на основе 'cover_id' поля в 'assets' связанных с 'Picture.id'

До сих пор это работало, когда я устанавливал связь Asset и Picture и 'Asset' belongsTo 'Cover'. Как-то это звучит не так, при этом изменение обложки объекта уничтожает все HABTM отношений в 'assets_pictures' для этого актива, поэтому я знаю, что здесь что-то не так. Я нахожусь в убытке ...

+0

probabily вы должны установить '» unique '=>' keepExisting'' при настройке отношений HABTM, посмотрите [руководство] (http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html# hasandbelongstomany-habtm) – arilia

ответ

0

Это не так, потому что вы настраиваете множественные отношения между двумя таблицами на уровне базы данных. Не уверен, какие из них, но это определенно нарушает несколько правил нормализации базы данных.

Представьте, что позже вы решите, что хотите отслеживать не только крышку, но и заднюю часть. Вам нужно будет добавить еще одно поле в таблицу активов back_id, которая вернет фотографии. Настоящий бардак ...

Правильный способ представления это включает в себя поле «типа» в таблице assets_pictures:

many to many relationship with additional data

Вы можете по умолчанию это поле для «нормального» (или даже null), и при необходимости измените его на «обложку». Обратите внимание, что это поле допускает дополнительные типы изображений (например, «назад»).

HABTM отношения могут справиться с этим без особых проблем. Параметр 'unique' => 'keepExisting' не позволяет CakePHP отбрасывать другие отношения уже на месте (что является поведением по умолчанию).

Однако при попытке сохранить данные все может осложниться отношениями «богатых» HABTM, особенно . Если это произойдет, и прежде чем вы вытащите волосы, вы можете пойти по маршруту 'hasMany through'.

Для удобства и для получения информации, вы можете создать дополнительные отношения HABTM для обложки в модели актива, который будет выглядеть примерно так:

public $hasAndBelongsToMany = array(
    'Cover' => array(
     'className' => 'Picture', 
     'conditions' => array('AssetCover.type' => 'cover'), 
    ) 
+0

Спасибо, миллион Inigo Flores ...! Это имеет смысл! –

+0

Отлично! Я рад, что это помогло. –

Смежные вопросы