Дополнительные данные CakePHP «многие ко многим» для каждого отношения - PullRequest
2 голосов
/ 30 июля 2009

Я относительно новичок в CakePHP, и я пишу приложение CakePHP, которое в настоящее время имеет модель Author и модель Book. Автор и Книга имеют отношения многие ко многим.
Тем не менее, я хотел бы дополнительно, для каждого отношения автора с книгой, иметь соответствующую ссылку на блог этого автора, где они размышляют над своим опытом написания этой книги.

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

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

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

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

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

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

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

(Кроме того, я понимаю, что у меня все еще была бы таблица SQL author_book. Это не беспокоит меня ни в малейшей степени, я думаю, что в любом случае обойтись невозможно.)

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

1 Ответ

6 голосов
/ 31 июля 2009

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

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

Опция "with" habtm:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...