Можно ли исправить внешний ключ в Yii, не настроив его в базе данных? - PullRequest
1 голос
/ 10 февраля 2011

Я использую phpMyAdmin для графического интерфейса своей базы данных, и он подключается к Yii Framework на моем веб-сайте.

Я хочу, чтобы моя таблица products имела, например, внешний ключ department_id, который являетсяссылка на поле id моей таблицы departments.К сожалению, в настоящее время у меня нет возможности правильно настроить внешний ключ в phpMyAdmin, поэтому department_id - это просто проиндексированное поле.Я не могу изменить конфигурацию phpMyAdmin в данный момент, поэтому он застрял, как будто он без внешнего ключа и средства связи.

Есть ли способ изменить Модели этих таблиц в Yii, чтобы они связывались?Я знаю, что внутри файла класса модели есть функция relations, которая содержит эту информацию:

return array('department_id' => array(self::BELONGS_TO, 'Departments', 'id'),

Не могу ли я просто добавить что-то похожее на приведенное выше?Есть ли еще работа для ног?Исправлено ли это (как в статическом, а не исправлено) из-за phpMyAdmin?

Cheers

1 Ответ

4 голосов
/ 10 февраля 2011

Если я не ошибаюсь, вам не нужно , чтобы mySql принудительно устанавливал отношения внешнего ключа, чтобы они по-прежнему работали в Yii. Установка ограничений FK в mySql обеспечивает надлежащую целостность базы данных, но я не думаю, что Yii на самом деле использует это во время выполнения.

При первоначальном запуске yiic (из Gii) для построения проекта, я думаю, что он смотрит на БД для построения правильных отношений в Модели, но не использует их после этого.

Затем Yii использует эти знания (из yiic) о связях таблиц, чтобы упростить вашу жизнь, предоставляя методы быстрого доступа для доступа к реляционным данным, и чтобы вы не нарушали ограничения mySql и не получали уродливые ошибки SQL и т. Д. все еще может использовать логику отношений Yii без базовых ограничений SQL. Единственная проблема будет в том, что если Yii испортит и назначит несуществующий FK или что-то еще, ваша база данных не поймает эту ошибку (ваша целостность данных будет более подвержена ошибкам).

Чтобы связать ваши продукты с отделами, просто убедитесь, что у вас есть поле отдела_идентификатора в Продукте (что звучит так же, как и у вас). Затем добавьте правило отношения, например, в Product:

'department' => array(self::BELONGS_TO, 'Department', 'department_id'),

А в вашем отделе модель:

'products' => array(self::HAS_MANY, 'Product', 'department_id'),

Теперь вы сможете использовать отношение как обычно:

$myProductModel->department; // returns the model of the Department referenced
$myDepartmentModel->products; // returns the models of all Products in the department

Удачи, и дайте мне знать, если я далеко от базы, и это не сработает для вас!

...