【问题标题】:edit pivot tablet with Laravel?使用 Laravel 编辑枢轴平板电脑?
【发布时间】:2016-09-09 13:56:04
【问题描述】:

我现在需要处理 3 个数据库表。域表、标签表和数据透视表。在我的数据透视表中,只有两个“主表”的 2 个外键。 domains_idtags_id 是两个外键。

我在这里按照此页面上的介绍进行操作: http://laraveldaily.com/pivot-tables-and-many-to-many-relationships/

但我仍然不明白“管理多对多关系:附加分离同步”部分。

我的标签控制器代码是:

 $id = Input::get('id');
    $request = $request->tagging;
    $tags = explode(',', $request);
    $all_tags = [];
    foreach ($tags as $tag) {
        $tag = trim($tag); // entfernen von leerstellen
        $friendly_tags = Str::slug($tag); // user friendly tags
        if (Str::length($friendly_tags)) {
            $all_tags[] = Tags_Domains::create([ 'name' => $friendly_tags ]);
        }
    }

    $domain = Domains::query()->findOrFail($id);
    $domain->tags()->saveMany($all_tags);

在函数的第一行,我得到了域的 ID。此 ID 应保存在我的数据透视表的 domain_id 属性中。

在这一行之后,我格式化用户想要添加的标签并将它们保存到我的 $all_tags 数组中。例如:

$all_tags = [sunny', 'fitness', 'healthy'];

现在我将它们保存在我的标签表中:

Tags_Domains::insert($all_tags);

现在我想将这些标签 ID 保存在我的数据透视表的 tags_id 属性中。我仍然不知道这是什么样子。 laravel 文档。真的没有帮助。


我的标签模型中的现实:

public function domains() { return $this->belongsToMany('App\Models\technical\Domains', 'domain_tag', 'id', 'domains_id'); }

我在我的领域模型中的实现:

public function tags() { return $this->belongsToMany('App\Models\technical\Tags_Domains', 'domain_tag', 'id', 'tags_id'); }

【问题讨论】:

  • 您不需要 Tags_Domains 模型,您应该只需要定义了多对多关系的 Tag 和 Domain 模型。查看文档laravel.com/docs/5.1/eloquent-relationships#many-to-many
  • 我已经添加了我的问题。我删除了枢轴模型并将问题底部的行添加到我的域模型中。 -- 但我还是不太明白怎么用..

标签: php laravel laravel-5 eloquent pivot-table


【解决方案1】:

您可以通过多种方式将标签链接到

如果你有一个 Tag 对象,你可以使用关系的 save()$saveMany() 方法来链接它:

$domain->tags()->save($tag);
$domain->tags()->saveMany([$tag1, $tag2]);

如果你有一个 ID,你可以使用 attach() 链接和 detach() 方法链接/取消链接给/从域的标签:

$domain->tags()->attach($tagId);
$domain->tags()->detach($tagId);

最后,有一个 sync() 方法更新关系,以便它只包含其 ID 作为参数传递的记录。以下将取消与域中的所有标签的链接,然后仅链接 ID 为 1 和 2 的标签:

$domain->tags()->sync(1,2);

就您而言,您需要更改创建标签的方式。像你这样批量插入既不会给你标签对象也不会给你标签ID,所以你需要一个一个地创建它们。您可以使用 saveMany() 将它们链接到域。

替换

$all_tags[] = [ 'tags' => $friendly_tags ];

$all_tags[] = Tag::create([ 'tags' => $friendly_tags ]);

然后就做

$domain->tags()->saveMany($all_tags);

【讨论】:

  • 我试了一下,但我遇到了一些错误。我会尝试修复它们并回信:)
  • 当然,如果还有任何问题,请告诉我,代码中可能存在拼写错误或其他代码存在一些问题。
  • 我用当前代码更新了我的问题,我还在尝试一些事情:)
  • Tags_Domains::insert($all_tags); -- 这让我很困惑.. 这条线一直运行良好 -- 我会尝试解决这个问题
  • 你不需要这条线。您不需要 Tags_Domains 模型。链接/取消链接应使用标签或域模型完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2012-01-19
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多