【问题标题】:Laravel loop issueLaravel 循环问题
【发布时间】:2018-01-19 19:07:44
【问题描述】:

我需要帮助来循环我的产品选项,这就是我现在所拥有的:

我想要的只是为color 获取两行唯一的一个,为size 获取另一行,并且在每个前面的下拉列表中都有所有项目。

这是我的刀片代码:

<tbody>
  @foreach($product->suboptions as $option)
  <tr>
    <td style="width: 150px;">{{ $option->option->title }}</td>
    <td class="text-left">
       <select name="" id="">
         <option value="{{$option->id}}">{{$option->title}} - {{ number_format($option->price, 0) }}</option>
       </select>
    </td>
  </tr>
  @endforeach
</tbody>

更新

{dd($product-&gt;suboptions)}}我的 dd 结果

【问题讨论】:

  • 你做了什么来调试这个?你试过print_r($products-&gt;suboptions)吗?颜色和大小会出现多次吗?
  • @BaileyParker 你是什么意思我做了什么?我分享了我有问题的代码。这是我的控制器代码$product = Product::where('slug', $slug)-&gt;firstOrFail();
  • 我的意思是 SO 不是来为您调试代码的。您应该在调试方面付出努力。在这种情况下,我建议在刀片循环之前使用print_r($product-&gt;suboptions),这样您就可以查看子选项是否确实重复。
  • @BaileyParker 我分享了@98​​7654332@结果
  • 在这一行 {{ $option->option->title }} 选项方法在哪里引用(什么表)?

标签: php laravel laravel-blade


【解决方案1】:

您可以先将它们与 mapToGroups() 函数一起组合成一个集合
https://laravel.com/docs/5.5/collections#method-maptogroups

$something = $product->suboptions->mapToGroups(function ($item, $key) {
    return [$item->option->title => $item];
});

你应该 dd() 来查看输出是什么并理解它。
之后,您可以使用 foreach 循环遍历它们,您的刀片应该类似于

<tbody>
  @foreach($something as $optiontitle => $optioncollection)
  <tr>
    <td style="width: 150px;">{{ $optiontitle }}</td>
    <td class="text-left">
      <select name="" id="">
        @foreach($optioncollection as $suboption)
          <option value="{{$suboption->id}}">{{$suboption->title}} - {{ number_format($suboption->price, 0) }}</option>
        @endforeach
      </select>
    </td>
  </tr>
  @endforeach
</tbody>

【讨论】:

  • hallelujah :))),效果很好,非常感谢。
  • 如果除了使用下拉菜单外,我还需要在其间添加逗号怎么办? implode他们?
  • 是的,我猜那是最好的。
  • laravel.com/docs/5.5/collections#method-implode 试试 $optioncollection->implode('id', ',');或者任何你想内爆的字段以及中间的语法,如果你想有标题,你可以做 $optioncollection->implode('title', ' - ') 例如。一般来说,我会建议尝试laravel.com/docs/5.5/collections#available-methods 一点点:)
【解决方案2】:

为了实现这一点,您需要先获取选项,然后编写一个通过产品 ID 或产品对象访问选项的方法。所以你可以在产品模型中纠正这样的事情:

   public function get_option($product_id){

       $sub_options = Product::whereId($product_id)->first()->suboptions()->get();

       $option = array();
       foreach($sub_options as $sub_option){
         $option[] = $sub_option->options()->get();
       }

    return $option;
  }

然后在视图中,您只需调用此方法并将其放入 2 个 foreach 中,一个用于选项,另一个用于子选项。如下代码:

<tbody>
  @foreach($product->get_option($product->id) as $key=>$value)
  <tr>
    <td style="width: 150px;">{{ $value->title }}</td>
     <td class="text-left">
       <select name="" id="">
         @foreach($value->suboptions() as $key=>$value2)
         <option value="{{$value2->id}}">{{$value2->title}} - {{number_format($value2->price, 0) }}</option>
         @endforeach
       </select>
    </td>
  </tr>
  @endforeach
</tbody>

我不知道你的模型方法是什么,但你可以理解这个概念。

我再重复一遍 你不应该完全复制我的代码。跟着我在说什么的概念。

但这一次是按照你雄辩的方法。这段代码应该可以工作。

【讨论】:

  • 未定义变量:product_id
  • public function options(){ return $this-&gt;belongsToMany(Option::class); } , public function suboptions(){ return $this-&gt;belongsToMany(Suboption::class, 'product_suboption', 'product_id', 'suboption_id'); }
  • @mafortis 这是一个概念。我的意思是你的产品ID。等我编辑一下。
  • @mafortis 您应该在产品模型中添加属于具有完全相同方法名称的关系。这样首先您访问 sub 选项。之后是与该产品相关的选项。
  • 我收到此错误Call to undefined method Illuminate\Database\Query\Builder::suboption()
猜你喜欢
  • 2020-05-22
  • 2016-06-16
  • 2021-02-20
  • 2014-05-23
  • 2021-02-11
  • 1970-01-01
  • 2018-11-05
相关资源
最近更新 更多