2014-05-28 5 views
6

У меня есть эти таблицы в БД:Laravel 4: многие ко многим (вставка)

[posts, cats (categories), posts_cats (pivote)] 

соотношение между столом сообщений и кошек многие ко многим

Я объявил соотношение в классах моделей:

//Post.php 
public function cats() 
{ 
    return $this->belongsToMany('cats'); 
} 



//Cats.php 
public function post() 
{ 
    return $this->belongsToMany('posts'); 
} 

вопрос в том, как вставить новое сообщение с несколькими категориями?

спасибо,

+1

Вашей сводная таблицы следует назвать: post_cat (сингулярный против множественного числа). Вы можете использовать альтернативное имя таблицы сводной таблицы, но тогда вам нужно указать имя этой таблицы в качестве второго аргумента методу ownToMany(). – Ilyes512

ответ

15

Допустим, вы знаете идентификатор поста, то вы можете прикрепить один кот, как это:

Post::find($post_id)->cats()->attach($cat_id); 

Или прикрепите несколько кошек следующим образом:

$cat_ids = array(1,2,3,4); 
Post::find($post_id)->cats()->attach($cat_ids); 

Если вы получили сообщение модель объекта в переменной, позволяет сказать, $ пост:

$post->cats()->attach($cat_id); 

// Or with multiple 
$cat_ids = array(1,2,3,4); 
$post->cats()->attach($cat_ids); 

Если у вас есть одна категория в качестве модели объекта, позволяет сказать, что $ модель:

$post->cats()->save($model); 

Остерегайтесь @Gadoma's answer. Это не так, но если вы хотите добавить категории в сообщение, у которого уже есть категории, вы должны использовать attach() вместо sync(). Sync() удалит все остальные, которые не были предоставлены ему при использовании.

редактировать:
Так что, если вы создаете новое сообщение, то вы, вероятно, делаете что-то вроде этого:

$post = new Post; 
$post->title = 'The title'; 
$post->something_else = 'Lorem'; 
$post->save(); 

//So now you have both the model object (the $post variable) and the id ($post->id). 

$post->cats()->attach($cat_ids); 
+0

что делать, если я не знаю, как отправить id (добавление нового сообщения с его предложениями) – mwafi

+0

Все еще легко do ... Я обновлю ответ. – Ilyes512

1

При вставке поста, а затем itterate над категориями и прикрепить их к новому сообщению. Что-то вроде этого:

// $categories is an array of the categories to attach 
foreach ($category_id in $categories) { 
    // Get a category object 
    $category = CategoryModel::find($category_id); 
    // $post is the new post 
    $post->cats()->attach($category); 
} 

Надеюсь, это вам поможет.

1

Из документов http://laravel.com/docs/eloquent#inserting-related-models

Inserting Related Models (Many To Many)

[...]

You may also use the sync method to attach related models. The sync method accepts an array of IDs to place on the pivot table. After this operation is complete, only the IDs in the array will be on the intermediate table for the model:

и пример кода:

$post = new Post(array('field1'=>'value1','fieldN'=>'valueN')) //example create new post 
$categoryIds = array(1,3,4,5); //ids of (cats) categories you want the post to go into 
$post->cats()->sync($categoryIds); //synchronise pivot table content with $categoryIds 
+0

Ошибка отображения: «MassAssignmentException title» refer to $ post = new Post (array ('title' => Input :: get ('title'), 'topic' => Input :: get ('topic'))) ; – mwafi

+0

Это так много! 5.1 docs link: http://laravel.com/docs/5.1/eloquent-relationships#syncing-for-convenience – SchizoDuckie

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