假设我有3个主表:category、tag、url
category和tag具有MANY_MANY关系。
tag和url具有MANY_MANY关系。
我想从category检索所有链接的url。
做这件事最简单、最有效的方法是什么?
我可以声明一种MANY_MANY_MANY关系吗?或者这在标准中是可行的吗?或者我必须用纯SQL来完成它?
我喜欢Criteria的想法,因为我稍后会传递'offset‘和'limit’参数用于分页目的……
发布于 2012-11-20 00:58:33
我可能发现了一个窍门:视图
我创建了以下视图:
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)我在Category中添加了以下关系:
self::MANY_MANY, 'Url', 'category_url(category_id, url_id)'我还没有做过广泛的测试。欢迎评论。
发布于 2012-11-20 00:15:58
我认为最好的方法是创建一些中间表来保存许多:例如,许多信息;
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'),
);
}要调用给定类别的所有urls,您应该能够:
$model = Category::model()->findByPk($categoryId);
$model->urls; // will be an array of url models that belong to the category.EDIT在重新阅读问题后添加了上面的编辑,我还没有测试过,你很可能需要对代码进行一些(或许多)编辑,但理论上这个原则应该是可行的。可能有一种更快的方法来获取“直通”关系数据,但我以前没有在两个多关系中实际使用过直通,所以我不需要自己尝试它。
https://stackoverflow.com/questions/13457030
复制相似问题