Установить ключ для разностного ключа при получении отношения laravel - PullRequest
1 голос
/ 06 марта 2020

Я хочу изменить ключ массива моей коллекции на код языка.

Вот мой код

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

Спасибо за любую помощь ..

Ответы [ 3 ]

1 голос
/ 08 марта 2020

Существует метод сбора, который называется keyBy . Кроме того, я не буду использовать условный параметр в отношениях так, как вы передаете $lang_id. Я бы предпочел создать два метода отношений.

Итак, вы можете сделать:

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

return response()->json($products);
0 голосов
/ 06 марта 2020

Вы можете попытаться переназначить ключ загруженного отношения после запроса следующим образом:

$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);
0 голосов
/ 06 марта 2020

Вы можете использовать mapWithKeys метод сбора.

Согласно Laravel Документация:

Метод mapWithKeys выполняет итерацию по коллекции и передает каждое значение заданному перезвонить. Обратный вызов должен возвращать ассоциативный массив, содержащий одну пару ключ / значение:

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

$keyed->all();

Ссылки: Laravel -> Коллекции -> Метод mapwithkeys

Laracast -> Изменить ключ связи красноречивой модели

...