В нашей среде BizTalk 2013 R2, KB4340005
был установлен как обновление .NET. Таким образом, в соответствии с предложениями мы хотели удалить KB, но пока мы проверяли установленные обновления, мы не можем видеть, что установленное обновление для .NET оказалось, что оно было установлено в другом пакете. Таким образом, мы не можем unistall KB4340005
.
Таким образом, мы сделали обходной путь, предложенный Microsoft. https://support.microsoft.com/en-us/help/4345913
Мы добавили локальную учетную запись сетевой службы в наши группы.
Если я правильно вас понимаю, ваши отношения должны выглядеть примерно так:
Service.php
public function cities()
{
return $this->belongsToMany(City::class);
}
City.php
public function services()
{
return $this->belongsToMany(Service::class);
}
public function state()
{
return $this->belongsTo(State::class);
}
Если возможно, я придерживайтесь по умолчанию и переименуйте сводную таблицу в city_service
State.php
public function cities()
{
return $this->hasMany('App\City');
}
public function country()
{
return $this->belongsTo('App\Country');
}
Country.php
public function states()
{
return $this->hasMany('App\State');
}
[1118 ] Чтобы получить желаемый результат, вы должны использовать аксессоров
City.php
public function getState ()
{
return $this->state->name;
}
public function getCountry ()
{
$country = Country::findOrFail($this->state->country_id);
return $country->name;
}
Теперь это немного дорого, но hasManyThrough () не будет работать здесь, потому что вам нужны обратные отношения. Это было предложено , но не принято. Есть пакет , но не уверен, что он стабилен. Кажется, заброшенный.
В любом случае, вы сможете запросить это и получить желаемый результат с помощью:
$services = Service::with('cities')->get();
Это был интересный вызов, поэтому я настроил его на тестовой машине и решил. Несомненно, есть другие способы сделать это, но это работает, и штат и страна будут доступны для использования на верхнем уровне, как вы хотели.
Параметры не будут отображаться в дампе dd()
, хотя они будут доступны для прямого доступа на верхнем уровне, и будет отображаться , если вы создадите дамп через JSON.
Я думаю, что самый простой способ помочь - это просто установить аксессоры на модели City. Затем, когда метод locations()
вызывается из модели Services, все города имеют необходимую информацию.
Модель города:
protected $fillable=[
'name',
'state_id',
];
protected $appends = ['state_name', 'country_name'];
public function state() {
return $this->hasOne(State::class, 'id', 'state_id');
}
public function getStateNameAttribute ()
{
return $this->state->name;
}
public function getCountryNameAttribute ()
{
return $this->state->country->name;
}
Обратите внимание на protected $appends = ['state_name', 'country_name'];
. Это позволяет отображать эти дополнительные поля при выгрузке в JSON. Если вам просто нужен доступ к дополнительным полям (state_name
и country_name
), вам не нужна эта строка - вы можете извлечь поля из части массива уровня города сейчас, так как у нас есть аксессоры в городе модель.
В запрос теперь должна быть включена более активная загрузка, чтобы эти средства доступа не пытались получить имя из нулевого значения. (Вы должны добавить нулевую проверку в аксессор). Я предлагаю сразу сделать все это так:
$data = \App\Service::with(['locations' => function($query){
$query->with(['state' => function($query){
$query->with('country');
}]);
}])->get();
Выполнение цикла for $data
теперь даст вам все необходимое в городе. уровень. Например :
foreach($data as $service){
echo "Service id: ".$service->id.": ";
echo $service->name."<br/>";
echo $service->locations->first()->name.", ";
echo $service->locations->first()->state_name." -- in the country: ";
echo $service->locations->first()->country_name;
echo "<br/><br/><br/>";
}
Это успешно дает:
Service id: 1: Tax Services
Annapolis, Maryland -- in the country: USA
Service id: 2: Legal Services
Potomac, Maryland -- in the country: USA