从 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 中的数组向数据透视表中的额外列添加条件值的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Lucid whereHas 按数据透视表中的最新列