【问题标题】:Set key to difference key when get laravel relationship获取laravel关系时将键设置为差异键
【发布时间】:2020-03-06 03:33:43
【问题描述】:

我想将我的集合数组键更改为语言代码。

这是我的代码

$products = Product::has('languages')->paginate(20);
        return response()->json($products);

这是我的关系

public function languages($lang_id = null)
{
    if ($lang_id)
        return $this->hasMany(ProductLang::class)->where('lang_id', $lang_id)->first();
    return $this->hasMany(ProductLang::class);
}

这是我现在得到的。

Illuminate\Database\Eloquent\Collection {#613 ▼
    #items: array:2 [▼
        0 => App\Models\Product\ProductLang {#614 ▶}
        1 => App\Models\Product\ProductLang {#615 ▶}
    ]
}

预期:

Illuminate\Database\Eloquent\Collection {#613 ▼
    #items: array:2 [▼
        en => App\Models\Product\ProductLang {#614 ▶}
        zh => App\Models\Product\ProductLang {#615 ▶}
    ]
}

感谢您的帮助..

【问题讨论】:

  • 您能否澄清一下您是如何获得ProductLang 的集合的,因为您的代码显示您正在查询Product
  • @Helioarch 我正在使用急切加载获取产品是的
  • 感谢您的澄清,我在下面提供了我的答案

标签: php laravel laravel-6 laravel-collection


【解决方案1】:

有一个收集方法叫做keyBy。另外,我不会像传递$lang_id 那样在关系中使用条件参数。我宁愿创建两个关系方法。

所以,你可以这样做:

$products = Product::has('languages')
    ->paginate(20)
    ->getCollection()
    ->map(function ($product) {
        return $product->languages->keyBy('lang_id');
    });

return response()->json($products);

【讨论】:

    【解决方案2】:

    您可以尝试在查询后重新映射已加载关系的键,如下所示:

    $products = Product::has('languages')->paginate(20);
    foreach($products as $product){
      $product->setRelation('languages', $product->languages->mapWithKeys(function($language){
          // Assuming the code is in the attribute `language_code`
          return [$language->language_code => $language]; 
        }));
    }
    
    return response()->json($products);
    

    【讨论】:

      【解决方案3】:

      您可以使用mapWithKeys收集方法。

      根据 Laravel 文档:

      mapWithKeys 方法遍历集合并传递每个 给定回调的值。回调应该返回一个关联 包含单个键/值对的数组:

      $keyed = $products->mapWithKeys(function ($item) {
          return [$item['locale'] => $item]; // assuming 'locale' key
      });
      
      $keyed->all();
      

      参考资料: Laravel -> Collections -> Method mapwithkeys

      Laracast -> Change eloquent model relationship key

      【讨论】:

        猜你喜欢
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        • 2019-02-16
        • 2020-07-12
        • 2016-12-22
        相关资源
        最近更新 更多