@nshafarenko

Отношение первой таблицы к третьей таблице через вторую таблицу, как?

Всем привет. Есть 3 таблицы.
Сразу напишу, PRIMARY ключи id (AI) не связанны между собой!!! Это просто порядковый номер и не более. Почему так? Потому что эти данные были получены по API, где "своя" связь (auto_marks.index < = > auto_models.mark_index и auto_models.index < = > auto_modifications.model_index):
1. auto_marks: - марки автомобилей
- id
- index (имеет прямую связь с auto_models.mark_index)

2. auto_models: - модели автомобилей
- id
- index (имеет прямую связь с auto_modifications.model_index)
- mark_index (имеет обратную связь с auto_marks.index)

3. auto_modifications: - модификации автомобилей
- id
- index
- model_index (имеет обратную связь с auto_models.index)


Собственно в чем вопрос. 3 модели созданы, это понятно. Нужно из первой модели (auto_marks) получить НЕ только количество моделей каждой марки, но нужно еще из первой модели (auto_marks) получить количество модификаций конкретной модели (auto_models). Возможно ли это вообще?
Количество моделей я спокойно получим в 1 модели следующим образом:
class AutoMark extends Model
{
    use HasFactory;

    public function models()
    {
        return $this->hasMany(AutoModel::class, 'mark_index', 'index');
    }
}


$marks = AutoMark::withCount('models')->get();
foreach($marks as $mark)
{
    // ... etc
    $mark->models_count; // все отлично выводит
}
  • Вопрос задан
  • 79 просмотров
Пригласить эксперта
Ответы на вопрос 1
iMedved2009
@iMedved2009
Не люблю людей
1. Открываем Laravel naming conventions и избавляемся от всех этих model_index. Фреймворк это не только набор инструментов, но так же набор соглашений которые стоит наблюдать

2. Открываем доку на пункте Has Many Through

class AutoMark extends Model
{
    use HasFactory;

    public function models()
    {
        return $this->hasMany(AutoModel::class, 'mark_index', 'index');
    }

    public function modifications()
    {
        return $this->hasManyThrough(AutoModification::class, AutoModel::class);
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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