Дополнительные данные CakePHP многие-ко-многим для каждого отношения

Я относительно новичок в CakePHP, и я пишу приложение CakePHP, которое в настоящее время имеет модель автора и модель книги. И у автора, и у книги есть отношения «многие ко многим».
Однако я хотел бы дополнительно для каждого отношения автор-книга иметь соответствующую ссылку на блог этого автора, где они размышляют о своем опыте написания этой книги.

Если это сбивает с толку, следующие параграфы попытаются уточнить мою ситуацию, чтобы прояснить мою ситуацию:

Для каждого автора для каждой книги будет по одной статье о своем опыте. Если посмотреть на эту взаимосвязь в обратном порядке, это означает, что для каждой книги будет одна соответствующая ссылка для каждого автора (учитывая, что у книг может быть несколько авторов), где этот автор описывает свой опыт написания книги.

Другими словами, для каждой пары (Автор, Книга) я хотел бы иметь возможность хранить связанный URL.

В более причудливых, абстрактных математических терминах, которые я буду использовать ужасно и неправильно: у меня есть неориентированный граф, где каждая вершина является Автором или Книгой, и каждое ребро имеет Автора для одной вершины и Книгу для другой. Это звучит немного сбивающе с толку, но (я думаю) оно описывает мою ситуацию настолько точно, насколько я могу это сделать.
Учитывая приведенное выше описание, я хочу знать, могу ли я прикрепить произвольные данные к любому заданному краю этого отношения, и получить его позже.

В настоящее время у меня есть третья модель, AuthorBook, которая действует на грани графа.
Автор имеет отношение hasMany к AuthorBook.
У книги есть отношение hasMany к AuthorBook.
AuthorBook имеет отношение ownTo с Author и Book, и дополнительно имеет поле url.

Это решение работает, но меня почему-то беспокоит тот факт, что Book не связан напрямую с Author. Есть ли способ добиться того же эффекта, при этом вырезав модель AuthorBook из картинки?

(Кроме того, я понимаю, что могу связать их напрямую, сохраняя AuthorBook, но это кажется уродливым и излишним.)

(Кроме того, я понимаю, что у меня все равно будет SQL-таблица author_book. Меня это нисколько не беспокоит, я думаю, что без нее все равно невозможно.)

Спасибо за уделенное время! И, пожалуйста, не плачь меня !!!


person Dan Passaro    schedule 29.07.2009    source источник


Ответы (1)


Да, вы можете смоделировать отношение AuthorBook (или «край», как вы его себе представляете).

class Author extends AppModel {
    ...
    $hasAndBelongsToMany = array('Book', array('with' => 'AuthorBook'));
    ....
}

Вариант "with" habtm:

Определяет имя модели для соединительной таблицы. По умолчанию CakePHP автоматически создаст модель для вас. В приведенном выше примере он будет называться RecipesTag. Используя этот ключ, вы можете переопределить это имя по умолчанию. Модель таблицы соединений может использоваться точно так же, как любая «обычная» модель для прямого доступа к таблице соединений.

Это эквивалент RoR "through", довольно красиво изображенный на этой иллюстрации < / а>

person deizel    schedule 31.07.2009
comment
Я считаю, что вы можете получить доступ к модели «с», используя цепочку моделей ($this->Book->AuthorBook или $this->Author->AuthorBook) без необходимости в этих дополнительных отношениях. Кроме того, вы должны иметь возможность сохранять в объединенной таблице, используя saveAll с ключом ['AuthorBook'] в вашем массиве ($this->Book->saveAll() или $this->Author->saveAll()). - person deizel; 01.08.2009