2013-11-11 3 views
1

У меня есть две модели: Model_Post и Model_Category. Мне удалось «найти» все связанные данные (просто как $ post -> $ categories), но теперь мне нужно создать отношения (в таблице posts_categories) между почтой и несколькими категориями при создании/обновлении/удалении сообщения ,FuelPHP Orm: set() для модели с отношением many_to_many и table_through

Вот 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

Для многие ко многим относительно работы между сообщение и Категория модели, вы должны иметь три таблицы в базе данных: сообщения, категории и categories_posts.

Первые два не должны нуждаться в пояснениях, а третья - обрабатывать отношение между двумя моделями. Это структура должна быть похожа на это:

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

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

Будучи $ размещать объект Model_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!"; 
} 

Обратите внимание на два логических параметров, передаваемых в сохранить() метод. Они должны каскадировать через отношения и использовать транзакции соответственно. Это хорошая идея использовать это, когда вы связываете модели за один раз.

Вы должны прочитать ORM documentation, были ли вы похожим примером на many to many relations, между прочим.

+0

Отлично! Только то, что я хотел, и с такой легкостью! – Lowbie

Смежные вопросы