首页 > 解决方案 > 获取laravel关系时将键设置为差异键

问题描述

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

这是我的代码

$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 ▶}
    ]
}

谢谢你的帮助..

标签: phplaravellaravel-6laravel-collection

解决方案


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

所以,你可以这样做:

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

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

推荐阅读