在laravel中保存多对多数据

时间:2014-08-02 20:05:55

标签: php laravel laravel-4

我正在尝试使用laravel创建一个简单的博客。

不幸的是,我迷失了试图通过雄辩的多对多关系将标签附加到新帖子。

任何帮助都会被理解为:

型号:

//post.php
public function blogTags(){
    return $this->belongsToMany('BlogTag', 'blogTag_post', 'post_id', 'blogTag_id');
}

//BlogTag.php
public function posts(){
    return $this->belongsToMany('Post', 'blogTag_post', 'blogTag_id', 'post_id');
}

从视图标记html(从get方法传入$categories):

<h3> Tags </h3>
    <select multiple class="form-control" id="tag">
        @foreach ($categories as $category)
        <option value="{{$category->id}}">{{$category->name}}</option>
        @endforeach
    </select>
</div>

我的控制器中的商店功能

$post = new Post();
$post->post_title  = Input::get('post_title');
$post->month = Input::get('month');
$post->date = Input::get('date');
$post->post_body    = Input::get('post_body');
$post->picture_path = $destinationPath ."/". $filename;
$post->post_author = $author;
$post->save();

foreach (Input::get('tag') as $tagId) {
    // look up the existing Tag by ID
    $tag = BlogTag::find($tagId);

    // save the Tag on the Post
    $post->blogTags()->save($tag);
}

我想我已经在圈子里谈过自己了。

具体来说,我的问题是:

  • 如何将select输入中的多个值发送到Controller方法?
  • 使用eloquent将数据附加到数据透视表的正确方法是$post->blogTags()->save($tag);吗?

TIA

2 个答案:

答案 0 :(得分:1)

问题是视图中的选择输入。

所以我改变了这个:

<select multiple class="form-control" id="tag">
                @foreach ($categories as $category)
                <option value="{{$category->id}}">{{$category->name}}</option>
                @endforeach
            </select>

{{Form::select('tag[]', $categories, null, array('multiple' => true));}}

多对多关系数据现在正保存在数据库中。

答案 1 :(得分:1)

您第一次尝试时遇到的问题并不是您没有使用Laravel Form辅助方法,而是您没有将多个数据作为数组传递,而且select元素缺少name属性。通过包含名称,您将获得一个值,但只有一个。使用数组表示法(foo [])允许多个值。

如果您想在html中执行以下操作,也可以使用以下内容:

<select multiple name="tag[]" class="form-control" id="tag">
    @foreach ($categories as $category)
        <option value="{{$category->id}}">{{$category->name}}</option>
    @endforeach
</select>

在旁注中,在您尝试将其保存到帖子之前,我还会进行有条件的检查是否存在$ tag。