Laravel 4:多对多(插入)

时间:2014-05-28 09:41:08

标签: php mysql laravel laravel-4

我在DB中有这些表:

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

帖子表和猫之间的关系是多对多

我在模型类中声明了关系:

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



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

问题是,如何插入包含多个类别的新帖子?

感谢,

3 个答案:

答案 0 :(得分:16)

假设您知道帖子的ID,那么您可以附加一只这样的猫:

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

或者像这样附上多只猫:

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

如果你在变量中得到Post模型对象,可以说$ post:

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

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

如果你有一个类别作为模型对象,可以说是$ model:

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

答案 1 :(得分:1)

当您插入帖子时,请迭代这些类别并将其附加到新帖子。这样的事情:

// $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);
}

我希望它可以帮到你。

答案 2 :(得分:1)

来自文档http://laravel.com/docs/eloquent#inserting-related-models

  

插入相关模型(多对多)

     

[...]

  您还可以使用同步方法附加相关模型。同步   method接受要放置在数据透视表上的ID数组。在这之后   操作完成后,只有数组中的ID才会出现   模型的中间表:

代码示例:

$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