Laravel 将枢轴附加到具有多个值的表
Posted
技术标签:
【中文标题】Laravel 将枢轴附加到具有多个值的表【英文标题】:Laravel attach pivot to table with multiple values 【发布时间】:2014-06-07 06:04:58 【问题描述】:背景
我正在创建一个围绕食物过敏的数据库,并且我在食物和过敏之间存在多对多的关系。还有一个名为severity
的枢轴值,它有一个数字,表示对该食物过敏的严重程度。
这个链接表是这样的;
food_id|allergy_id|severity
-------|----------|--------
1 | 1 | 3
1 | 4 | 1
2 | 2 | 1
问题
尝试使用 Eloquent 更新链接表时(其中$allergy_ids
是一个数组)
$food->allergies()->attach($allergy_ids);
如何将多个值与数据透视表一起添加到数据透视表中?
我可以使用上面的行一次性添加特定食品的所有allergy_id
,但我怎样才能同时在severity
列中添加一系列不同的严重性值?也许像
$food->allergies()->attach($allergy_ids, $severity_ids);
编辑:如果这有帮助的话,对特定食物的过敏可能在 0-20 之间,并且每种过敏的严重程度等级在 0-4 之间。
【问题讨论】:
【参考方案1】:你不能像你喜欢的那样做,所以我建议一个简单的循环:
foreach ($allergy_ids as $key => $id)
$food->allergies()->attach($id, array_get($severity_ids, $key));
// should you need a sensible default pass it as a 3rd parameter to the array_get()
解决方法 但是,如果您想附加多个具有单一严重性级别/ID 的过敏症,那么您可以这样做:
$food->allergies()->attach($allergy_ids, array('severity' => $singleSeverityValue));
【讨论】:
foreach ($allergy_ids as $key => $id) $food->allergies()->attach([$id], ['severity' => array_get($severity_ids, $key )]);这是我用来让它工作的代码的更新版本。原来attach
方法期望将数组传递给它。谢谢!
您的意思是如果不将 $id 转换为数组,它对您不起作用?这应该不是问题,因为 attach 方法无论如何都会将其转换为数组。
@JarekTkaczyk 成功了! =>
,我的问题是我有一个逗号:-P【参考方案2】:
你可以。
来自 Docs 中的这个示例(4.2,5.0):
$user->roles()->sync(array(1 => array('expires' => true)));
前两行的硬编码版本:
$food = Food::find(1);
$food->allergies()->sync([1 => ['severity' => 3], 4 => ['severity' => 1]]);
动态地,当您的数组 $allergy_ids 和 $severities 处于兼容状态(大小和排序)时,您应该事先准备好同步数据。比如:
$sync_data = [];
for($i = 0; $i < count($allergy_ids); $i++))
$sync_data[$allergy_ids[$i]] = ['severity' => $severities[$i]];
$food->allergies()->sync($sync_data);
【讨论】:
太好了,你解决了我的问题@Nuno Rafael Figueiredo 这对我有用 @sanu。我很高兴,但你不应该赞成我的回答吗? 也适用于attach
。笔记!!!使用同步将删除$sync_data
中不存在的所有内容,并添加表中不存在的内容。它相当于detach()
,然后是attach()
。注意完全相等,但关闭,因为不会先分离现有记录。
由于更多赞成票而接受此作为答案,并且似乎比 2 年前的旧答案更相关。
我只需将 添加到 $sync_data = []; for($i = 0; $i $severities[$i]]; $food->allergies()->sync($sync_data);【参考方案3】:
确实最简单的方法是附加额外的数据,如下所示:
$retailer->paymentmethods()->attach($paymentmethod, array('currency' => $paymentmethod->currency));
更改食物过敏严重程度的值,但您会得到提示... :-)
【讨论】:
【参考方案4】:从 Laravel 5.1 版(目前在 Laravel 8.x 中)开始,可以将数组作为第二个参数传递,其中包含需要保存在中间表中的所有附加参数。 你可以read in the documentation
将关系附加到模型时,您还可以传递要插入中间表的附加数据数组:
$user->roles()->attach($roleId, ['expires' => $expires]);
为方便起见,附加和分离也接受 ID 数组作为输入:
$user->roles()->attach([1 => ['expires' => $expires], 2, 3]);
那么你可以简单地做
$food->allergies()->attach([1 => ['severity' => 3], 4 => ['severity' => 1]]);
【讨论】:
以上是关于Laravel 将枢轴附加到具有多个值的表的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.5 枢轴连接以获取具有主要 MySQL 结果的枢轴值