【问题标题】:Display one attribute to group others around it in foreach loop PHP Laravel在 foreach 循环 PHP Laravel 中显示一个属性以将其他属性分组
【发布时间】:2021-03-03 20:14:50
【问题描述】:

在我的项目中,所有用户都存储在user 表中。作为供应商的人,他们的用户密钥进入supplier 表。

每个产品都可以有多个变体。关键产品进入productattribute 表。

每个供应商可以有多个具有多个属性的产品。

所以有一个多对多的产品属性和供应商表,名为productsupplier

我想为用户提供创建新采购订单的选项。 采购订单将针对供应商。

用户将选择供应商,然后分配给他的所有产品都会显示出来。

问题是同名的产品可以有不同的属性。因此,当我为某个供应商的产品编写代码以显示时,一种产品(具有不同的变体)会出现多次。 我一直在努力使用 distinctunique 函数来显示一个产品的名称一次,但由于它在 foreach 循环中,它不工作。

代码如下:

public function new_po_next(Request $request)
{
    $product = array();
    $supplier = \App\supplier::where('user_id', $request->supplier)->first();
    $productsupplier = \App\productsupplier::where('supplier_id', $supplier->id)->get();

    foreach ($productsupplier as $ps) {
        $productattribute = \App\productattribute::where('id', $ps->productattribute_id)->first();

        $prod = \App\product::where('id', $productattribute->product_id)->first();
        $product [] = [
            'prod_supp_id' => $ps->id,
            'prod_supp_prodattid' => $ps->productattribute_id,
            'prod_supp_cost' => $ps->cost,
            'prod_att_id' => $productattribute->id,
            'prod_att_color' => $productattribute->color_id,
            'prod_att_size' => $productattribute->size_id,
            'prod_att_material' => $productattribute->material_id,
            'prod_att_prodid' => $productattribute->product_id,
            'prod_id'=>$prod->id,
            'prod_name' =>$prod->name,
        ];
    }
    $status = $request->status;
    $deldate = $request->deldate;
    $discount = $request->discount;
    return view("vendor.new-po-next")
        ->with('status', $status)
        ->with('deldate', $deldate)
        ->with('discount', $discount)
        ->with('product', $product);
}

此代码给出以下结果(这是正确的结果,因为 product1 只有 1 个变体,但 product5 有 3 个变体)。

我想要的是它显示“product1”和“product5”(product5 ONCE only)。 如果用户选择 product5,那么它会显示可供选择的其余变体。

请告诉我怎么做!

【问题讨论】:

  • 第一个问题,你们的模型之间的关系是什么?为什么你不能只做$productsupplier->productattributes 而不是在循环中遍历所有这些数据库查找?
  • productattribute 键正在进入 productsuppliers 表。
  • 我照你说的做了,它给出了这个错误:Property [productattributes] does not exist on this collection instance.
  • 当然不是,如果你还没有建立适当的关系。
  • productattribute 键正在进入 productsuppliers 表。这不正确吗?

标签: php laravel


【解决方案1】:

如何使用 Laravel 集合,你可以将你的数组转换为集合,

// After the loop is finished.
$productCollection = collect($product);
$groupedProductCollection = $collection->groupBy('prod_name');

$groupedProduct = $groupedProductCollection->all(); // all method will convert it back to array

// then return the value
return view("vendor.new-po-next")
        ->with('status', $status)
        ->with('deldate', $deldate)
        ->with('discount', $discount)
        ->with('product', $groupedProduct);

工作

假设您的产品阵列是这样的

$product = [
    ['prod_name' => 'product5', 'prod_supp_cost' => '$4'],
    ['prod_name' => 'product5', 'prod_supp_cost' => '$3'],
    ['prod_name' => 'product1', 'prod_supp_cost' => '$6'],
]

那么在groupby之后会是这样,

[
        'product5' => [
            ['prod_name' => 'product5', 'prod_supp_cost' => '$4'],
            ['prod_name' => 'product5', 'prod_supp_cost' => '$3'],
        ],
        'product1' => [
            ['prod_name' => 'product1', 'prod_supp_cost' => '$6'],
        ],
    ]

然后,当用户单击它时,您将在列表中显示 array_keys 及其值。

编辑:如何在前端使用它

<select id="" name="">
@foreach(array_keys($groupedProduct) as $product_names)
      <option value="{{ $product_names }}"></option>
@endforeach
</select>

如果有人点击,则使用$groupedProduct[$product_names]显示它


尽管@miken32 建议的长期和最佳解决方案是使用雄辩的关系并让关系处理所有查询,这样就不需要for loop

【讨论】:

  • 您也可能已经注意到 group by 增加了数组维度,但在您的情况下,它应该没问题,因为您希望在用户点击后显示值。
  • ``` @foreach($groupedProduct as $prods) @endforeach ``` 在前面-end,会这样迭代吗?
  • 一旦用户点击选项,例如Product5,我做了一个jquery onClick函数。在该函数中,我如何访问与该特定选项选择相关联的 Id 和其他属性(在本例中为 Product5 的 Id 和属性)。
  • onclick 触发器,将 $groupedProduct[$product_names] 传递给 jquery ,请参阅此答案以参考stackoverflow.com/questions/61381188/…
  • 嗨@bhucho,我有一个问题。在前端,我们通过以下代码访问数组: @foreach(array_keys($groupedProduct) as $prod_name) {{$prod_name}} 当我们想要访问数组中的其他内容时,例如prod_id ,我们该怎么做?
猜你喜欢
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-02
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
相关资源
最近更新 更多