【问题标题】:Laravel many to many insert each sideLaravel 多对多插入每一侧
【发布时间】:2018-06-17 05:36:01
【问题描述】:

我的问题可能很简单,但我找不到正确的答案,我不知道我的做法是否正确。

我有一个文章和一个标签表,在 id 上有一个数据透视表。

我尝试做的是:

  • 插入文章
  • 如果不存在则插入标签
  • 插入关系

我的代码是:

$tags = [];
        foreach ($request->input('tags') as $key => $value) ;
            $tag = Tag::firstOrCreate(['nom' => $value]);
            $article->tags()->sync($tag);
        }

但它只同步最后一个标签。也许有比在 foreach 循环上同步更好的方法?

感谢您的帮助。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    eloquent sync method 声明:

    sync 方法接受要放置在中间表上的 ID 数组。任何不在给定数组中的 ID 都将从中间表中删除。所以,这个操作完成后,中间表中只会存在给定数组中的ID。

    由于您在foreach 循环中执行此操作,因此它将在循环的每次迭代中删除除相应标记之外的所有值。您想改为提供一组标签并在最后同步。

        foreach ($request->input('tags') as $key => $value) ;
            $tags[] = Tag::firstOrCreate(['nom' => $value])->id;
        }
        $article->tags()->sync($tags);
    

    【讨论】:

    • 哦,对了,谢谢!你知道是否有更好的方法来创建标签吗?
    • 我对 Laravel 不是很精通,但这对我来说似乎是个好方法。
    • 我在尝试您的代码时遇到了非法偏移错误:/
    • 不应该是$tags[] = Tag::firstOrCreate(['nom' => $value])->id;吗? sync() 文档中的引用说[...] accepts an array of IDs [...],目前您正在向它传递一个对象数组。
    • @Furya 再试一次 id 正如 Namoshek 提到的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2014-07-17
    • 1970-01-01
    • 2014-12-08
    • 2014-11-28
    • 1970-01-01
    • 2021-10-27
    相关资源
    最近更新 更多