从 Laravel 中的数组向数据透视表中的额外列添加条件值

Posted

技术标签:

【中文标题】从 Laravel 中的数组向数据透视表中的额外列添加条件值【英文标题】:Adding a conditional value to extra column in pivot table from array in Laravel 【发布时间】:2017-01-12 06:19:27 【问题描述】:

我知道问题标题有点模糊,但这是我想要做的:

我正在从第三方 api 检索用户所属的组列表。在某些情况下,用户将是一个组的“管理员”,而其他时候,只是一个“成员”。 抛开细节不谈,我从我的控制器调用我的 api 类上的一个方法,该方法命中 api,检索用户的组,确定他们是否是“管理员”,然后返回一个数组数组,其中每个组的信息包括一个“角色”键,表示他们是否是“管理员”。所以我返回的数组看起来像这样:

[
  0 => [
    'unique_id' => 1243657,
    'name' => 'Group1',
    'city' => 'Bluesville',
    'state' => 'IN',
    'role' => 'admin'

  ],

  1 => [
    'unique_id' => 4324567,
    'name' => 'Group2',
    'city' => 'New Curtsbourough',
    'state' => 'WI',
    'role' => 'member'
  ],

  2=>  [
    'unique_id' => 87463652,
    'name' => 'Group3',
    'city' => 'Samsonite',
    'state' => 'MN',
    'role' => 'member'
  ]
]

现在,我需要获取这些组并将它们存储在数据库中,我首先检查该组在数据库中不存在,然后在需要时添加它。当然,我要离开这个角色,因为它只与当前用户相关。

接下来,我需要将当前用户连接到刚刚检索到的这些组。我设置了一个数据透视表,当前包含 user_id 和 group_id。

问题是,如何最好地处理这个问题。在我决定我需要知道一个成员是否是“管理员”之前,我只是让我的“createGroups”方法返回一个主键数组给我,然后将该数组传递给对

的调用
$user->groups()->sync($array_of_ids);

但是,添加了“角色”信息后,它就没有那么简单了。

基本上,在生命周期的这一点上,我可以访问一组包含字段“角色”的组。我的想法是在数据透视表中添加一个“角色”字段,然后将包含“user_id”、“group_id”和“role”。这意味着我不仅需要包含检索到的组的 $groups 数组,还需要这些组的 ID,因为它们与我的数据库有关。

我可以做一些事情,但我担心它会非常混乱和低效。

有人想吗??

【问题讨论】:

【参考方案1】:

好的,正如在 *** 上多次发生的那样,我已经为自己的问题找到了解决方案。我发帖是为了万一有人偶然发现我的问题需要做类似的事情,他们至少可以看到一个人是如何处理它的。

根据 Laravel 文档,如果你想与添加的列同步关系,你需要通过以下方式调用同步:

$user->groups()->sync([
    1 => ['role' => 'admin'], 
    2 => ['role' => 'member'], 
    3 => ['role' => 'member']
]);

所以在我可以同步之前,我需要一个类似于传递给“同步”的数组的数组。

由于我有一个“组”数组,其中每个组都包含一个名为“角色”的字段,因此我创建了一个“createGroups”方法,该方法基本上循环了 $groups 数组并调用了 Laravel 提供的“insertGetId”方法。该方法将对象持久化到数据库并返回创建记录的主键。对于我的“createGroups”方法,我执行了以下操作:

public function createGroups($groups)

    $added = array();
    foreach($groups as $group)
        $id = $this->createGroup($group);
        $added[$id] = ['role' => $group['role']];
    

    return $added;

因此,当我将“组”插入数据库时​​,我正在构建“同步”方法所需的数组。由于 'createGroup' 方法使用 Laravel 的 'insertGetId' 方法,它返回该组的主键。然后我使用该 id 作为数组的键。插入所有组后,返回到控制器的“添加”数组如下所示:

[
    1 => ['role' => 'admin'], 
    2 => ['role' => 'member'], 
    3 => ['role' => 'member']
]

这正是“同步”方法需要做的事情。

编码愉快!

【讨论】:

以上是关于从 Laravel 中的数组向数据透视表中的额外列添加条件值的主要内容,如果未能解决你的问题,请参考以下文章

laravel4 更新数据透视表中的附加列

Laravel Lucid whereHas 按数据透视表中的最新列

Laravel 5 - 从数据透视表额外属性获取属性

从 Laravel 中的 Mysql Pivot 表中获取列并返回 JSON 对象

Laravel - 将其他列值保存到数据透视表

Laravel,sync() - 如何同步数组并传递额外的数据透视字段?