Функция отношений в модели AR, отношение многие к одному - PullRequest
2 голосов
/ 27 августа 2010

Итак, вот сценарий:

У меня есть две таблицы, Issue & Project.

Проект может иметь много проблем, а проблема - ровно один проект.

Поскольку проблема много в одном, нужно ли ее определять?

Потому что я знаю, что в модели проекта у меня есть:

public function relations()
{
    return array(
    'issues' => array(self::HAS_MANY, 'Issue', 'project_id'),
    'users' => array(self::MANY_MANY, 'User', 'tbl_project_user_assignment(project_id, user_id)'),
    );
}

Для модели проблемы у меня есть только внешние ключи:

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array(
        'requester' => array(self::BELONGS_TO, 'User', 'requester_id'),
        'owner' => array(self::BELONGS_TO, 'User', 'owner_id'),
        'project' => array(self::BELONGS_TO, 'Project', 'project_id'),
    );
}

Я угадываю что-нибудь одномуотношения не должны быть определены?

Заранее спасибо.

Кстати, я делаю гибкую книгу по Yii, и в итоге я задал себе этот вопрос.В классе AR есть опция has-one (http://www.yiiframework.com/doc/guide/database.arr).

Но является ли этот случай необязательным по какой-то причине?

Ответы [ 2 ]

5 голосов
/ 28 августа 2010

Это помогает мне думать о разнице между BELONGS_TO и HAS_ONE как "где хранится внешний ключ"? Если модель проекта хранит «Issue_Id», то потенциально у «Issue» может быть много проектов. Вы используете отношение HAS_ONE, чтобы утверждать, что, даже если Проблема МОЖЕТ иметь много проектов, она имеет только ОДИН.

Тем не менее, более распространенный случай, если вы сохраняете Project_Id в модели проблем (и я полагаю, что вы). Затем вы должны использовать отношение BELONGS_TO. Похоже, что вы правильно определили отношения выше.

Кто-то опубликовал похожий вопрос, касающийся отношений Yii, на который я помог ответить: yii - использование отношения HAS_ONE для получения данных из связанной таблицы для отображения на странице списка

Что касается вашего беспокойства по поводу «необходимости» определения отношений, вам не «нужно» определять их. Вы можете написать свои собственные запросы SQL, чтобы сделать то же самое. Отношения ActiveRecord - это просто удобство для упрощения запросов к связанным записям. Если вы никогда не собираетесь искать проект проблемы, вам не нужно «определять» отношение проекта «BELONGS_TO».

Не видя структуры вашей базы данных, мне кажется, что все настроено правильно. Теперь вы можете легко сделать как $ Issue-> Project, так и $ Project-> Issues «ленивые» реляционные запросы, полностью используя возможности реляционной активной записи. Ура и удачи с проектом!

1 голос
/ 28 августа 2010

В вашей модели Issue у вас уже есть отношение, указанное как BELONGS_TO модели проекта.

Я также только что получил новую книгу yii.Это мне очень помогло!

Удачного кодирования:)

...