FuelPHP Orm: set() для модели с отношением many_to_many и table_through

У меня есть две модели, Model_Post а также Model_Category, Мне удалось "найти" все связанные данные (просто как $post->$category), но теперь мне нужно создать отношения (в таблице posts_categories) между постом и несколькими категориями при создании / обновлении / удалении поста,

Вот модель_пост

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 ответ

Решение

Для связи многих со многими между моделями Post и Category у вас должно быть три таблицы в вашей базе данных: записи, категории и категории_постов.

Первые два не должны нуждаться в объяснении, а третий должен обрабатывать отношение "многие / многие" между двумя моделями. Его структура должна быть похожа на это:

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, где вы найдете аналогичный пример по многим отношениям, между прочим.

Другие вопросы по тегам