1

我有两个模型,Model_PostModel_Category。我已经设法“找到”所有相关数据(就像 $post->$categories 一样简单),但现在我需要在帖子的创建/更新/删除时在帖子和多个类别之间创建关系(在 posts_categories 表中) .

这是 Model_Post

protected static $_many_many = array(
    'categories' => array(
        'table_through' => 'posts_categories',
        'key_through_from' => 'post_id',
        'model_to' => 'Model_Category'
    )
);

型号_类别

protected static $_properties = array(
    'id',
    'name',
    'created_at',
    'updated_at'
);

protected static $_many_many = array(
    'posts' => array(
        'table_through' => 'posts_categories',
        'key_through_from' => 'id',
        'key_through_to' => 'post_id',
        'model_to' => 'Model_Post'
    )
);

posts_categories 表字段:id, name.

我被困在这里。我应该如何构建查询?

$post->categories = Model_Category::forge()->set(array(
       // I can't get any further
    ),
);

我还需要为关系表制作模型吗?

4

1 回答 1

1

对于PostCategory模型之间的多对多关系,您的数据库中应该有三个表:postscategoriescategories_posts

前两个不需要解释,第三个是处理两个模型之间的多/多关系。它的结构应该类似于:

CREATE TABLE `categories_posts`
(
    `category_id` BIGINT UNSIGNED NOT NULL,
    `post_id`     BIGINT UNSIGNED NOT NULL,

    PRIMARY KEY   (`category_id`, `post_id`)
);

作为$post一个 Model_Post 对象和$post->categories一个关联类别的数组,我们可以开始工作了。

要开始关联,我们创建一个新的Model_Category对象并将其添加到数组中:

// forge object
$category = Model_Category::forge();

// set name
$category->name = 'Brand New Category';

// associate with Posts
$post->categories[] = $category;

/**
 * we can repeat the last three steps as many times as we want
 * or as many times as we need
 */

// finally, save the relation
if ($post->save(true, true)) {
    echo "Everything OK";
} else {
    echo "Houston, we've got a problem!";
}

注意传递给save()方法的两个布尔参数。它们将通过关系级联并分别使用事务。在一次关联模型时使用它是一个好主意。

您应该阅读ORM 文档,如果您会找到关于多对多关系的类似示例,等等。

于 2013-11-11T22:14:51.193 回答