首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多对多对多?

多对多对多?
EN

Stack Overflow用户
提问于 2012-11-19 23:35:34
回答 2查看 441关注 0票数 0

假设我有3个主表:categorytagurl

categorytag具有MANY_MANY关系。

tagurl具有MANY_MANY关系。

我想从category检索所有链接的url

做这件事最简单、最有效的方法是什么?

我可以声明一种MANY_MANY_MANY关系吗?或者这在标准中是可行的吗?或者我必须用纯SQL来完成它?

我喜欢Criteria的想法,因为我稍后会传递'offset‘和'limit’参数用于分页目的……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-20 00:58:33

我可能发现了一个窍门:视图

我创建了以下视图:

代码语言:javascript
复制
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中添加了以下关系:

代码语言:javascript
复制
self::MANY_MANY, 'Url', 'category_url(category_id, url_id)'

我还没有做过广泛的测试。欢迎评论。

票数 0
EN

Stack Overflow用户

发布于 2012-11-20 00:15:58

我认为最好的方法是创建一些中间表来保存许多:例如,许多信息;

代码语言:javascript
复制
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;

还有..。

代码语言:javascript
复制
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

在您的类别模型中:

代码语言:javascript
复制
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,您应该能够:

代码语言:javascript
复制
$model = Category::model()->findByPk($categoryId);

$model->urls; // will be an array of url models that belong to the category.

EDIT在重新阅读问题后添加了上面的编辑,我还没有测试过,你很可能需要对代码进行一些(或许多)编辑,但理论上这个原则应该是可行的。可能有一种更快的方法来获取“直通”关系数据,但我以前没有在两个多关系中实际使用过直通,所以我不需要自己尝试它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13457030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档