Laravel отношение таблицы к сводной таблице - PullRequest
4 голосов
/ 17 февраля 2020

Я запутался в том, как настроить мою модель в laravel с помощью таблицы, подключенной к сводной таблице.

Вот проблема

Скажите, что у меня

Locations
    id
    name

area_types
    id
    name

area_type_location (Pivot table)
    id
    location_id
    area_type_id

area_test
    id
    area_type_location_id
    clean
    headCount

Отношения между таблицами разных типов типов принадлежат разным локациям. то есть: пляж, 25-метровые бассейны, детские бассейны, барбекю, и т. д. c

area_test подключен к сводной таблице, потому что тест должен быть создан из области, которая существует, в данном случае это область, которая зарегистрирована под разными локациями. Таким образом, его нужно проверять ежедневно, измерять и т. Д. c.

Я понимаю структуру между area_types и location для отношений многие ко многим, однако я не могу понять, как мне структурировать свою структуру. модель area_test? Как получить данные из таблицы расположений -> где мой тест?

Должен ли я создать модель для моей сводной таблицы? Является ли это хорошей практикой в ​​laravel?

У кого-нибудь есть такой же вариант использования?

Я читал о eloquent , у которого есть отношения от многих до , но я понимаю, что это так не говоря уже о прохождении сводной таблицы. Я не совсем понимаю, если мой вариант использования такой же.

Спасибо

Ответы [ 2 ]

3 голосов
/ 17 февраля 2020

Нет необходимости создавать новую модель для сводной таблицы. Просто укажите в Местоположение модель под кодом:

  /**
   * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
   */
  public function area_types()
  {
        return $this->belongsToMany('App\AreaType', 'area_type_location', 'location_id', 'area_type_id');

  }

и укажите ниже код в AreaType модель:

  /**
   * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
   */
  public function locations()
  {
        return $this->belongsToMany('App\Location', 'area_type_location', 'area_type_id', 'location_id');

  }

каждый раз, когда вам нужно например, чтобы получить местоположение area_type в каждом контроллере, вы можете вызвать функцию следующим образом: $areatype->locations()->get();

Не забудьте создать миграцию таблицы area_type_location.

Если этот ответ решил вашу проблему, нажмите ✔️ и примите его.

0 голосов
/ 18 февраля 2020

Наконец, по-видимому, есть пара способов получить данные из таблицы locations в area_tests

Попробовал на повозке, и все работает,

Во-первых, мне нужно создать Сводная модель для моей сводной таблицы:

class LocationAreaType extends Pivot{

public function location(){
    return $this->belongsTo(Location::class);
}

public function areaType(){
    return $this->belongsTo(AreaType::class);
}

public function AreaTests(){
    return $this->hasMany(AreaTest::class, 'location_area_type_id');
}

}

Я могу использовать hasManyThrough отношение, которое мне нужно создать в моей таблице местоположений

public function areaTests()
{
    return $this->hasManyThrough(
        AreaTest::class,
        LocationAreaType::class,
        'location_id',
        'location_area_type_id');
}

таким образом Я могу легко получить тесты области с помощью $location->areaTests. Моя проблема не заключалась в определении location_area_type_id как иностранного. Вы должны определить это, по-видимому, когда я расширяю сводную область и использую hasMany laravel не распознает внешний ключ автоматически.

Таким образом, я также могу получить к нему доступ через сводную таблицу с помощью

$location->areaType[0]->pivot->areaTests

Но , поскольку laravel распознает только внешний ключ из обеих таблиц location_id и area_type_id, я должен включить id сводной таблицы чтобы получить данные таблицы AreaTest (поскольку она определяется по стороннему признаку location_area_type_id

Поэтому в модели Location мне нужно получить столбец

public function poolTypes()
{
    // Get the ID of the pivot table to get the poolTests table (connected with ID column)
    return $this->belongsToMany(PoolType::class)
        ->using(LocationPoolType::class)
        ->withPivot('id');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...