peanut
(Alexander Lomakin)
August 6, 2009, 10:10am
1
Всем привет!
У меня есть две таблицы:
users: user_id, name
articles: article_id, title
И есть таблица связка:
user_articles: u_id, article_id
Связь, которая вытаскивает все статьи для пользователя выглядит так:
'articles' => array(
self::MANY_MANY, 'Article', 'user_articles(u_id, article_id)'
)
Внимательный читатель скажет, что будет выдана ошибка: "The relation "articles" in active record class "User" is specified with an invalid foreign key "u_id". The foreign key does not point to either joining table." И будет абсолютно прав!
Вопрос: как в ассоциации MANY_MANY указать, что у меня ключ в таблице users и user_articles разные?
P. S. Не предлагайте поменять структуру таблицы!!!
Demyan
(Realdemyan)
August 6, 2009, 10:34am
2
Проблем с разныи именами ключа таблицы и внешнего ключа в связывающей таблице быть не должно.
Указаны ли при создании таблиц первичные и внешние ключи. Имеется в виду, в СУБД.
AR полагается на метаданные об отношениях, чтобы определить, каким образом следует объединять таблицы, поэтому для использования реляционной AR необходимо, чтобы все связи отношения первичный-внешний ключ были четко определены между объединяемыми таблицами.
Документация
peanut
(Alexander Lomakin)
August 6, 2009, 10:43am
3
Нет, user_id не указан как primary key. Означает ли это, что для MANY_MANY нельзя использовать поля, которые не указаны как primary key?
Demyan
(Realdemyan)
August 6, 2009, 10:58am
4
Нет, user_id не указан как primary key. Означает ли это, что для MANY_MANY нельзя использовать поля, которые не указаны как primary key?
Вероятно, можно. Тут скорее дело во внешних ключах. В вашем случае поля таблицы "user_articles": "u_id" и "article_id" должны быть внешними ключами, связанными с каким-либо полем соответствующей таблицы. Иначе AR просто не поймёт каким образом строить связь. Насчет первичного ключа не уверен.
peanut
(Alexander Lomakin)
August 6, 2009, 11:08am
5
Demyan:
Вероятно, можно. Тут скорее дело во внешних ключах. В вашем случае поля таблицы "user_articles": "u_id" и "article_id" должны быть внешними ключами, связанными с каким-либо полем соответствующей таблицы. Иначе AR просто не поймёт каким образом строить связь. Насчет первичного ключа не уверен.
Спасибо. Я думал можно какой-нибудь хитрый аргумент указать в relation . Видимо, все-таки, придется делать изменения в базе данных.
Demyan
(Realdemyan)
August 6, 2009, 11:17am
6
На самом деле, там же в документации, есть такая фраза:
Но думаю, это означает, что в этом случае как раз должны быть указаны первичные ключи в таблицах, с которыи осуществляется связь.
peanut
(Alexander Lomakin)
August 6, 2009, 11:31am
7
Demyan:
Но думаю, это означает, что в этом случае как раз должны быть указаны первичные ключи в таблицах, с которыи осуществляется связь.
Я думаю, что я поэкспериментирую с этим.
DARX
(Ioxanssen)
August 19, 2009, 2:14pm
8
Без изменения структуры таблицы никак. Нужно задать первичные ключи поям users.user_id и aritcles.article_id.
А поля в user_articles сделать как foreign keys.