假设我有 3 个主表:
category
, tag
,url
category
并tag
有一个 MANY_MANY 关系。
tag
并url
有一个 MANY_MANY 关系。
我想从中category
检索所有链接的url
.
最简单、最有效的方法是什么?
我可以声明一种 MANY_MANY_MANY 关系吗?或者这在标准上可行吗?还是我必须用纯 SQL 来做?
我喜欢 Criteria 的想法,因为我稍后将传递它的“偏移”和“限制”参数以用于分页目的......
假设我有 3 个主表:
category
, tag
,url
category
并tag
有一个 MANY_MANY 关系。
tag
并url
有一个 MANY_MANY 关系。
我想从中category
检索所有链接的url
.
最简单、最有效的方法是什么?
我可以声明一种 MANY_MANY_MANY 关系吗?或者这在标准上可行吗?还是我必须用纯 SQL 来做?
我喜欢 Criteria 的想法,因为我稍后将传递它的“偏移”和“限制”参数以用于分页目的......
我认为最好的方法是创建一些中间表来保存多:多信息,例如;
CREATE TABLE `categories_tags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_categories` int(11) NOT NULL,
`id_tags` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
ALTER TABLE `categories_tags`
ADD CONSTRAINT `categories_tags_ibfk_1` FOREIGN KEY (`id_categories`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `categories_tags_ibfk_2` FOREIGN KEY (`id_tags`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
和...
CREATE TABLE `tags_urls` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id_tags` int(11) NOT NULL,
`id_urls` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
ALTER TABLE `tags_urls`
ADD CONSTRAINT `tags_urls_ibfk_1` FOREIGN KEY (`id_tags`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `tags_urls_ibfk_2` FOREIGN KEY (`id_urls`) REFERENCES `urls` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
您可以在这些表之间的关系中使用through 。
在您的类别模型中:
public function relations()
{
return array(
'categoryTags' => array(self::_MANY, 'CategoriesTags', 'id_categories'),
'tags' => array(self::HAS_MANY, 'Tag', 'id_tags', 'through'=>'categoryTags'),
'tagsUrls' => array(self::HAS_MANY, 'TagUrl', 'id_tags', 'through'=>'tags'),
'urls' => array(self::HAS_MANY, 'Url', 'id_url', 'through'=>'tagsUrls'),
);
}
要调用给定类别的所有网址,您应该能够:
$model = Category::model()->findByPk($categoryId);
$model->urls; // will be an array of url models that belong to the category.
[编辑] 在重新阅读问题后添加了上面的编辑,我没有测试过,您可能需要对代码进行一些(或许多)编辑,但原则上应该有效。可能有一种更快的方法来获取“通过”关系数据,但我之前实际上并没有在两个多:多关系中使用 through,所以不需要自己尝试一下。
我可能发现了一个窍门:VIEWS
我创建了以下视图:
CREATE VIEW category_url AS
(SELECT DISTINCT category.id AS category_id, url.id AS url_id
FROM category
LEFT JOIN category_tag ON category_tag.category_id=category.id
LEFT JOIN url_tag ON url_tag.tag_id = category_tag.tag_id
LEFT JOIN url ON url.id = url_tag.url_id)
我在类别中添加了以下关系:
self::MANY_MANY, 'Url', 'category_url(category_id, url_id)'
我还没有进行广泛的测试。欢迎评论。