Это был интересный вызов, поэтому я настроил его на тестовой машине и решил. Несомненно, есть другие способы сделать это, но это работает, и штат и страна будут доступны для использования на верхнем уровне, как вы хотели.
Параметры не будут отображаться в дампе 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
Этот комментарий от Raymond Chen указывает, что значок прибывает из самого exe, я предложил бы использовать что-то как eXeScope, чтобы удостовериться, что Ваш значок приложения встраивается правильно, и, возможно, сравните его с другими exes, которые отображают правильное поведение, чтобы сделать отладку дельты.
Значок группы панели задач может быть установлен в реестре на на основание приложения.
Для проводника это было бы здесь:
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\explorer.exe]
"TaskbarGroupIcon"="C:\Windows\Explorer.exe,13"
Иконка группы панели задач приложения может быть установлена двумя способами
Через свойства проекта:
Щелкните проект в проводнике решений → щелкните правой кнопкой мыши → выберите свойства → выберите вкладку Application → перейдите к resoruces и измените иконку по умолчанию и выберите новую иконку, сохраните и создайте.
Через реестр (динамический):
Вы должны создать ключ TaskbarGroupIcon и значение "файл иконки с путем" в разделе "HKEY_CURRENT_USER\SOFTWARE\Classes\Applications\<>" Если вышеуказанные ключи отсутствуют, вам необходимо создать
RegistryKey RegKey = Registry.CurrentUser.OpenSubKey(
"Software\\\\Classes\\\Applications\temp.exe",true);
RegKey.SetValue("TaskbarGroupIcon", "c:\temp.ico", RegistryValueKind.String);