laravel eloquent pivot с основным идентификатором для ссылки на другой pivot - PullRequest
0 голосов
/ 03 марта 2019

У меня проблема с отношениями между сводными таблицами.

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

Мне нужны эти списки (с красноречивым):

$country = Country::findOrFail(1)->with('streets', 'numbers')
foreach ($country->streets as $street){
    foreach($street->numbers as $number) {
       $number;
    }
}

Или существует какое-либо решение?

Это только пример.Официальные названия таблиц изменены.

Пример структуры:

Table Countries
    id
    name

Table Streets
    id
    name

Table country_street
   id
   country_id
   street_id

Table number_country_street
   id
   number_id
   country_street_id

Table numbers
   id
   name

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

@ dparoli была хорошая идея.

Иногда для отношений «многие ко многим» используется класс наследования Pivot, но пока это не имеет значения.

Так что теперь мы можем использовать эти коды длясписки.

$country = Country::findOrFail(1);
foreach ($country->countryStreet as $countryStreet){
    echo $countryStreet->street->name
    foreach($countryStreet->numbers as $number) {
       $number;
    }
}

class Countries
     public function countryStreet()
     {
         return $this->hasMany(CountryStreet::class, 'country_id', 'id');
     }

Class CountryStreet with method block() using relation hasOne

Еще одна реализация.

0 голосов
/ 03 марта 2019

ИМХО с вашими таблицами я бы определил дополнительную модель: CountryStreet, что-то вроде этого:

// CountryStreet
class CountryStreet extends Model
{
    public function city()
    {
         return $this->belongsTo('App\City');
    }

    public function street()
    {
         return $this->belongsTo('App\Street');
    }
    public function numbers()
    {
         return $this->belongsToMany('App\Number', 'number_country_street');
    }
}

// Country
class Country extends Model
{
    public function streets()
    {
         return $this->hasManyThrough('App\Street', 'App\CountryStreet');
    }
}

// Streets
class Street extends Model
{
    public function countries()
    {
         return $this->hasManyThrough('App\Country', 'App\CountryStreet');
    }
}

// Number
class Number extends Model
{
    public function country_streets()
    {
         return $this->belongsToMany('App\CountryStreet', 'number_country_street');
    }
}
...