Yii: Лучший способ ссылаться на строки в нескольких таблицах? - PullRequest
1 голос
/ 05 февраля 2011

Каков наиболее удобный для Yii «стандартный» способ ссылки на запись какой-либо модели?

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

Итак, как упоминалось в комментарии ниже, какой-то «унифицированный первичный ключ»

Я думал, что каждая модель является расширением базовой модели и ссылкой, как, например, в этот вопрос . Или просто иметь отдельное поле для каждой модели, на которое можно ссылаться.

Может быть, еще один способ сделать это - сохранить модель и идентификатор записи в поле, а затем просто переопределить реляционную «магию» активных записей

1 Ответ

1 голос
/ 08 февраля 2011

То, что вы пытаетесь сделать, является сложной проблемой, потому что mySql поддерживает только отношения First Normal Form, а не наследование OOP. Это называется "полиморфная ассоциация". Есть несколько решений, хотя. Действительно хороший ответ SO, который описывает некоторые из них, можно найти здесь:

Можно ли сделать внешний ключ MySQL для одной из двух возможных таблиц?

Один из возможных вариантов решения (я думаю, что второй из перечисленных в приведенной выше ссылке) с Yii может состоять в том, чтобы иметь одну таблицу «объект» с полем «тип», а затем разделить таблицы с полями, необходимыми для другие виды "объектов". Затем в методе afterFind () базовой модели объектов посмотрите на поле типа и присоедините к ним тип Поведения , которые разрешают доступ к столбцам таблицы типов.

Кроме того, , если вам действительно нужен более простой способ создания ссылок или коротких URL-адресов , вы можете написать в фреймворке несколько дополнительных функций, которые в основном просто упрощают создание ссылок на объект. Имеют отдельные модели для всех типов объектов, как обычно, но имеют центральную таблицу с главным первичным ключом (или слагом URL), который имеет отношение к отдельным типам. Вы можете переопределить createUrl (), чтобы он просто брал главный ключ (независимо от типа содержимого), а затем создать правильную ссылку, посмотрев, какую модель / контроллер использовать в главной таблице.

Это то, что позволяет вам делать псевдонимы URL в Drupal. Проще, чем воссоздать систему, подобную Drupal CCK! Что в любом случае было бы ненужным, если бы вам не понадобилась гибкость для изменения контента в будущем.

...