Laravel. Как передать значение из PIVOT в следующий запрос
Есть таблицы geographic_code, zone_map, tariff_zone, связующая таблица phone_zone_map_item.
Столбцы:
geographic_code : code
zone_map: id, title
tariff_zone: id, title
phone_zone_map_item: map_id(zone_map:id), code(geographic_code:code), zone_id(tariff_zone:id)
Получаю зону с географическими кодами, с помощью связующей таблицы:
ZoneMap::query()->with(["codes"])->whereId(12)->first()
-----------------------
public function codes(){
return $this->belongsToMany(
GeographicCode::class,
"phone_zone_map_item_" . $this->config["id"],
"map_id", "code", null, "code"
)->withPivot("zone_id");
}
Дальше мне нужно для каждого географического кода получить его тарифную зону, ID тарифной зоны это zone_id в связующей таблице. Думал что сработает вот так:
public function codes(){
return $this->belongsToMany(
GeographicCode::class,
"phone_zone_map_item_" . $this->config["id"],
"map_id", "code", null, "code"
)->withPivot("zone_id")->with("zone");
}
в моделе GeographicCode
public function zone(){
return $this->belongsTo(TariffZone::class, "id", "zone_id");
}
Но значение PIVOT не передается. Каким образом можно передать zone_id из pivot в следующий запрос? На выходе я хочу получить следующий массив:
[
"id" => 12,
"title" => Карта зон,
"codes" => [
0 => [
"code" => 79542,
"zone" => [
"id" => 13,
"title" => "Внутризоновая связь"
]
]
]
]
Ответы (1 шт):
Прошу прошения. Было несколько ошибок:
- в таблице
geographic_codeне было primary ключа. - не правильно был составлена связь
"к одному через"(hasOneThrough)
Вот так выглядит код:
ZoneMap::with("codes.zone")->whereId(12)->first()
class ZoneMap extends Model {
public function codes(){
return $this->hasManyThrough(
GeographicCode::class,
TariffZoneByGeographicCode::class,
"map_id", "code", null, "code"
);
}
}
class GeographicCode extends Model {
public function direction(){
return $this->hasOne(Direction::class, "id", "dest_id");
}
public function zone(){
return $this->hasOneThrough(
TariffZone::class,
TariffZoneByGeographicCode::class,
"code", "id", null,"zone_id"
);
}
}