0

假设我有 3 个主表: category, tag,url

categorytag有一个 MANY_MANY 关系。

tagurl有一个 MANY_MANY 关系。

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

最简单、最有效的方法是什么?

我可以声明一种 MANY_MANY_MANY 关系吗?或者这在标准上可行吗?还是我必须用纯 SQL 来做?

我喜欢 Criteria 的想法,因为我稍后将传递它的“偏移”和“限制”参数以用于分页目的......

4

2 回答 2

0

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

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,所以不需要自己尝试一下。

于 2012-11-19T16:15:57.647 回答
0

我可能发现了一个窍门: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)'

我还没有进行广泛的测试。欢迎评论。

于 2012-11-19T16:58:33.237 回答