Laravel Model Relationships - Какие отношения я пытаюсь создать? - PullRequest
1 голос
/ 04 июля 2019

У меня есть 3 модели, связанные с этим вопросом;Страна, производитель и регион.

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

Мои таблицы настроены так:

manufacturers
 - id
 - name

countries
 - id
 - name

regions
 - id
 - name
 - manufacturer_id
 - country_id

Что я хочубыть способным сделать это значит написать $manufacturer->countries в моем блейде и заставить его выплюнуть страны, связанные с данным производителем.

Модели в настоящее время связаны друг с другом следующим образом:

Country.php

public function manufacturers()
{
    return $this->hasMany(Manufacturer::class);
}

public function regions()
{
    return $this->hasMany(Region::class);
}

Region.php

public function manufacturer()
{
    return $this->belongsTo(Manufacturer::class);
}

public function country()
{
    return $this->belongsTo(Country::class);
}

и где у меня возникла проблема, Manufacturer.php

Я думаю, что мне нужна hasManyотношения.Я уже получил;

public function regions()
{
    return $this->hasMany(Region::class);
}

, и я бы подумал, что мне понадобится;

public function countries()
{
    return $this->hasManyThrough(Country::class,Region::class);
}

, но это приводит к этой ошибке;

Column not found: 1054 Unknown column 'countries.region_id' in 'on clause' (SQL: select `countries`.*, `regions`.`manufacturer_id` as `laravel_through_key` from `countries` inner join `regions` on `regions`.`id` = `countries`.`region_id` where `regions`.`manufacturer_id` = 4)

поэтому я попытался поменять местами классы, чтобы дать;

public function countries()
{
    return $this->hasManyThrough(Region::class,Country::class);
}

, но это приводит к;

Column not found: 1054 Unknown column 'countries.manufacturer_id' in 'field list' (SQL: select `regions`.*, `countries`.`manufacturer_id` as `laravel_through_key` from `regions` inner join `countries` on `countries`.`id` = `regions`.`country_id` where `countries`.`manufacturer_id` = 4)

Кто-нибудь знает, как я должен установить свои отношения, чтобы добиться того, что яхочу?

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

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

В Laravel лучшее отношение, которое нужно применить - это many to many отношение. Применительно к вашему делу это означает, что 1 country может иметь несколько manufacturers, а 1 manufacturer может быть в нескольких странах.

Если это так, вам не нужно создавать таблицу regions, а скорее pivot table. Соглашение о присвоении имен по умолчанию в laravel (единственное и без алфавитного порядка), то есть country_manufacturer таблица и он будет содержать (Вы всегда можете добавить дополнительную переменную, известную как pivot значение):

country_manufacturer
  - id
  - name // pivot value
  - manufacturer_id
  - country_id

Затем в моделях добавьте отношение belongsToMany, т.е.

В модели производителя (без оси):

public function countries()
{
   return $this->belongsToMany(Manufacturer::class);
}

в модели страны (с осью):

public function manufacturers()
{
   return $this->belongsToMany(Country::class)->withPivot('name');
}

Следовательно, вы сможете позвонить по номеру $country->manufacturers(), который предоставит вам список всех производителей в $country, и наоборот: $manufacturer->countries предоставит вам все страны, в которых базируется производитель.

0 голосов
/ 04 июля 2019

Вы на самом деле имеете дело с отношением «многие ко многим».

В вашем случае regions - это сводная таблица.

Просьба проверить принадлежит ToMany.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...