gpt4 book ai didi

php - 如何在 Laravel 中同步同一个属性的多个值?

转载 作者:可可西里 更新时间:2023-11-01 08:39:22 25 4
gpt4 key购买 nike

我使用 Laravel 5.4 开发了一个电子商务(具有多个产品属性功能)网站。一切正常。但是当我尝试同步数据透视表中同一属性的多个值时。 Laravel 会忽略重复的 pares。例如,我有一个名为“网络”的属性,它有 3 个值:2G、3G、4G。手机支持3G和4G网络。我想在数据库中同步 3G 和 4G 值。 Laravel 忽略其中之一。

Products Table: 

ID - Product Name
1 - Test Mobile



Attributes Table

ID - AttributeName
1 - Network



AttributeValues Table

ID - AttributeID - AttributeValue
1 - 1 - 2G
2 - 1 - 3G
3 - 1 - 4G



ProductAttributes Table

ID - AttributeID - ProductID - AttributeValue
1 - 1 - 1 - 3G
1 - 1 - 1 - 4G

我想将产品属性存储在类似这样的“ProductAttributes”表中。但是 Laravel 忽略了其中一个。

我正在这样保存数据:

    $product = Product::create([
'name' => 'Test Mobile'
]);

$product->attributes()->sync([
1 => ['AttributeValue' => '3G'],
1 => ['AttributeValue' => '4G']
]);

有什么建议、想法吗?

最佳答案

我知道这已经晚了两年,但我今天正在处理同样的问题,我想我可以把解决方案留在这里,以防将来有人寻找它。如果您使用原始代码:

    $product->attributes()->sync([
1 => ['AttributeValue' => '3G'],
1 => ['AttributeValue' => '4G']
]);

数组中的第二项会覆盖第一项,所以最后,数据库中只会有一个“4G”条目。这不是真正的 Laravel 问题,而是 PHP 关联数组的实现方式 - 数组中的两个项目基本上不能位于同一索引上。

其实有两种方法可以解决这个问题

1) 第一个效率很低,但很实用。我把它留在这里只是为了记录,因为那是我解决问题的最初方式。除了您的代码,您还需要这样的东西

    $product->attributes()->sync([]);  // empty relation completely

// add first item
$product->attributes()->syncWithoutDetaching([
1 => ['AttributeValue' => '3G'],
]);

// add second item without detaching the first one
$product->attributes()->syncWithoutDetaching([
1 => ['AttributeValue' => '4G'],
]);

这是非常低效的,因为它需要一个查询来从关系中删除所有现有数据,然后一项一项地添加新项。您还可以在循环内运行 syncWithoutDetaching,整体效率低下很大程度上取决于您需要同步的项目数量。

2) 第一个解决方案不够好,所以我不断地挖掘和试验,想出了一个方法来实现这个目标。您可以发送没有给定特定索引的数组,并将 ID 放在数组本身中,而不是将您的项目放在数组中的特定索引上。像这样

    $product->attributes()->sync([
['AttributeID' => 1, 'AttributeValue' => '3G'],
['AttributeID' => 1, 'AttributeValue' => '4G']
]);

通过这种方式,您实际上可以将具有相同 AttributeID 的两个项目发送到 sync() 方法,而不会一个覆盖另一个

关于php - 如何在 Laravel 中同步同一个属性的多个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42091778/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com