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