FuelPHP Orm:set()用于具有many_to_many关系和table_through的模型

时间:2013-11-11 13:24:38

标签: php fuelphp fuelphp-orm

我有两个模型,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'
    )
);

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
    ),
);

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

1 个答案:

答案 0 :(得分:1)

对于发布类别模型之间的多对多关系,您的数据库中应该有三个表:帖子类别 categories_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->类别一个关联类别的数组,我们可以开始工作了。

要开始关联,我们伪造一个新的 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 documentation,您是否会在many to many relations上找到类似的示例,等等。