Запрос удаленных отношений с использованием таблицы отношений

В нашей среде BizTalk 2013 R2, KB4340005 был установлен как обновление .NET. Таким образом, в соответствии с предложениями мы хотели удалить KB, но пока мы проверяли установленные обновления, мы не можем видеть, что установленное обновление для .NET оказалось, что оно было установлено в другом пакете. Таким образом, мы не можем unistall KB4340005.

Таким образом, мы сделали обходной путь, предложенный Microsoft. https://support.microsoft.com/en-us/help/4345913

Мы добавили локальную учетную запись сетевой службы в наши группы.

0
задан ghan 18 January 2019 в 20:38
поделиться

2 ответа

Если я правильно вас понимаю, ваши отношения должны выглядеть примерно так:

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();
0
ответ дан Archie 18 January 2019 в 20:38
поделиться

Это был интересный вызов, поэтому я настроил его на тестовой машине и решил. Несомненно, есть другие способы сделать это, но это работает, и штат и страна будут доступны для использования на верхнем уровне, как вы хотели.

Параметры не будут отображаться в дампе 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
0
ответ дан Watercayman 18 January 2019 в 20:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: