Laravel保存了许多关系

时间:2017-09-20 08:33:31

标签: php laravel model laravel-eloquent

模型

public function categories()
{
    return $this->belongsToMany('App\Category', 'post_categories');
}

public function posts()
{
    return $this->belongsToMany('App\Post', 'post_categories');
}

控制器

public $DEFAULT_LANGUAGE = 1;
public function store(Request $request)
{
    $titles = $request->PostTitle;
    $post = new Post();
    $post->PostTitle = $titles[$this->DEFAULT_LANGUAGE];
    $post->save();
    $post->categories()->attach($request->categoryID[$this->DEFAULT_LANGUAGE]);
    unset($titles[$this->DEFAULT_LANGUAGE]);
    foreach ($titles as $key => $title) {
        $post = new Post();
        $post->PostTitle = $request->PostTitle[$key];
        $post->save();
        $post->categories()->attach($request->categoryID[$key]);
    }

    return response()->json($post);

查看

<select class="form-control category-list" name="categoryID[]" multiple="multiple" data-placeholder="Pilih Kategori">
    @foreach($categories as $category)
        <option value="{{ $category->id }}">
            {{ $category->CategoryName }}
        </option>
    @endforeach
</select>

如果我有两个类别并且我想选择所有类别,为什么我只能获得最后一个类别?我也尝试使用foreach,但我得到了错误偏移。 任何的想法?

我有两个标签窗格.. 我在选项卡1中存储了两个categoryID,在选项卡2中存储了一个categoryID ..然后我单击提交按钮..标题响应在选项卡1中的两个categoryID,但在我的数据库中,我只获得了最后一条记录

  • PostTitle [1]:sadasd
  • 的categoryID [1]:1
  • 的categoryID [1]:2
  • PostTitle [2]:asdasd
  • 的categoryID [2]:1

当我进行控制时,它会显示两个CategoryID ..

https://i.stack.imgur.com/jBl2B.png

5 个答案:

答案 0 :(得分:1)

附加/分离

来自docs

  

Eloquent还提供了一些额外的辅助方法来使其工作   与相关型号更方便。例如,让我们想象一下用户   可以有很多角色,角色可以有很多用户。附加角色   通过在连接的中间表中插入记录来向用户提供   模型,使用attach方法:

您只传递一个附加值,因此只获取最后一条记录,以便获得传递所有categoryID所需的全部内容

public $DEFAULT_LANGUAGE = 1;
public function store(Request $request)
{
    $titles = $request->PostTitle;
    $post = new Post();
    $post->PostTitle = $titles[$this->DEFAULT_LANGUAGE];
    $post->save();
    $post->categories()->attach($request->categoryID[$this->DEFAULT_LANGUAGE]);
    unset($titles[$this->DEFAULT_LANGUAGE]);
    $data= array();
    foreach ($titles as $key => $title) {
        $post = new Post();
        $post->PostTitle = $request->PostTitle[$key];
        $post->save();
        $data[]= $post->categories()->attach($request->categoryID[$key]);
    }

    return response()->json($data);

`

答案 1 :(得分:1)

我找到了解决方案.. 我只需要更改视图

<select class="form-control category-list" name="categoryID[{{$language->id}}][]" multiple data-placeholder="Pilih Kategori">
  @foreach($categories as $category)
    <option value="{{$category->id}}">{{$category->CategoryName}}</option>
  @endforeach
</select>

并更改控制器

$post->categories()->attach($request->categoryID[$this->DEFAULT_LANGUAGE]);

答案 2 :(得分:0)

你在使用这个模型的是什么,它的名字是什么? 通常它是这样做的: 应用\类别:

public function posts()
{
    return $this->belongsToMany('App\Post', 'post_categories');
}

应用\发表:

public function categories()
{
    return $this->belongsToMany('App\Category', 'post_categories');
}

这两个关系不在同一个文件中,而是在两个连接的单独模型中。

答案 3 :(得分:0)

试试这个兄弟。 我只是在控制器中更改你的代码。 我希望它可以帮到你:)

模型

public function categories()
{
    return $this->BelongsToMany('App\Category', 'post_categories');
}

public function posts()
{
    return $this->BelongsToMany('App\Post', 'post_categories');
}

控制器

$post = App\Post::findOrFail($id);
$post = $post->load('categories');
$attributes = $post->attributes->toArray();

查看

<select class="form-control category-list" name="categoryID[]" multiple="multiple" data-placeholder="Pilih Kategori">
    @foreach($categories as $category)
        <option value="{{ $category->id }}">
            {{ $category->CategoryName }}
        </option>
    @endforeach
</select>

答案 4 :(得分:0)

在您看来,尝试更改多个=&#34;多个&#34;只是多个