【问题标题】:Laravel edit Product, set correct selected (with many-to-many)Laravel 编辑产品,设置正确选择(多对多)
【发布时间】:2017-10-16 16:11:29
【问题描述】:

我有一个系统,其中用户有商店,商店有产品。

现在一个 Shop 可以有多个 Products,一个 Product 可以属于多个 Shop。当用户添加新产品时,他/她可以选择他/她想要添加的商店

商店

+----+---------+----------------+
| id | user_id |      name      |
+----+---------+----------------+
|  1 |       1 | My First Shop  |
|  2 |       1 | My Second Shop |
+----+---------+----------------+

商店_产品

+---------+------------+-----------+
| shop_id | product_id |   image   |
+---------+------------+-----------+
|       1 |          1 | beer.jpg  |
|       1 |          2 | wine.jpg  |
|       1 |          3 | vodka.jpg |
+---------+------------+-----------+

我的问题是,当用户编辑产品时,我想使用该产品分配到的当前商店预填充商店选择下拉列表。

但是下面的查询返回一个集合因此是多对多

$product = Product::findOrFail($id)->shops

在我看来,要设置正确的选择选项,我正在尝试以下操作

@foreach(\Auth::user()->shops as $shop)
    <option value="{{ $shop->id }}" @if($shop->id == $product->shop->id) selected @endif>{{ $shop->description }}</option>
@endforeach

$product->shop->id 不起作用,因为 $product->shop 是一个集合

期待你的想法!谢谢

【问题讨论】:

    标签: php laravel collections


    【解决方案1】:

    我认为在您的情况下,您可以在集合上使用 contains 方法 (https://laravel.com/docs/5.4/collections#method-contains)

    例子:

    @foreach(\Auth::user()->shops as $shop)
        <option value="{{ $shop->id }}" {{ $product->shops->contains('id', $shop->id) ? "selected" : "" }} >{{ $shop->description }}</option>
    @endforeach
    

    代码$product-&gt;shops-&gt;contains('id', $shop-&gt;id)检查商店集合是否包含'id'$shop-&gt;id的键值组合

    【讨论】:

      【解决方案2】:

      试试这个

      @foreach(\Auth::user()->shops as $shop)
          <option value="{{ $shop->id }}" {{ in_array($shop->id, $product->shops->pluck('id')) ? 'selected' : ''  }}>{{ $shop->description }}</option>
      @endforeach
      

      在您的收藏中使用 pluck 方法可以返回您商店的所有 id :)

      【讨论】:

        【解决方案3】:

        我认为这将是pluck() 方法的完美候选者,我相信您可以这样做:

        $shops = Product::findOrFail($id)->shops()->pluck('description', 'id');
        

        在您看来,您可以这样做:

        @foreach ($shops as $key => $value) {
          <option value="{{ $key }}">{{ $value }}</option>
        @endforeach
        

        【讨论】:

          【解决方案4】:

          使用shop_id 代替$product-&gt;shop-&gt;id

          @foreach(\Auth::user()->shops as $shop)
              <option value="{{ $shop->id }}" @if($shop->id == $product->shop_id) selected @endif>{{ $shop->description }}</option>
          @endforeach
          

          【讨论】:

          • shop_id 不可用,因为产品只是产品,而不是多对多关系。
          猜你喜欢
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 2017-11-04
          • 1970-01-01
          • 1970-01-01
          • 2022-08-14
          • 1970-01-01
          • 2017-11-02
          相关资源
          最近更新 更多