laravel многоуровневый многие ко многим

#laravel #eloquent-relationship

#laravel #красноречивые отношения

Вопрос:

У меня есть 3 модели, отрасль, категория, машина, и они связаны следующим образом

  • Отрасль может иметь несколько категорий, а категория может относиться только к одной отрасли (идентификатор отрасли хранится в таблице категорий)
  • В категории может быть несколько машин, и машина может быть в нескольких категориях (с использованием сводной таблицы)

Проблема: я хочу показать все машины в отрасли, как я могу это сделать?

Что я сделал до сих пор: я извлек все идентификаторы категорий, относящиеся к конкретной отрасли, например: $industry-> categories()-> pluck(«id»). Я не знаю, что я могу сделать дальше, чтобы получить все машины

Ответ №1:

Industry модель отношения:

 class Industry {
    public function categories(){
        return $this->hasMany(Category::class);
    }
}
  

Category модель отношения:

 class Category {
    public function indusry(){
        return $this->hasOne(Industry::class);
    }

    public function machines(){
        return $this->belongsToMany(Machine::class);
    }
}
  

Machine модель отношения:

 class Machine {
    public function categories(){
        return $this->belongsToMany(Category::class);
    }
}
  

вы можете использовать whereHas метод, подобный этому:

 $machines = Machine::whereHas('categories', function($query) {
    $query->whereHas('indusry', function($sub_query) {
        $sub_query->where('name', {your_industry});
    });
});
  

Комментарии:

1. Я должен хранить «category_id» в таблицах машин, чтобы это работало. Чего я не могу, потому что у меня много-много отношений между категориями и машинами. Что достигается с помощью сводной таблицы

2. вам не нужно хранить category_id , когда вы используете hasManyThrough отношение from , это может обеспечить связь между machines и industries , и вы можете получить доступ ко всем машинам в такой отрасли, как: $industry->machines()

3. Я получаю эту ошибку: SQLSTATE[42S22]: Столбец не найден: 1054 Неизвестный столбец ‘machines.category_id’ в предложении ‘on’ (SQL: выберите count (*) в качестве агрегата из machines inner join categories on categories . id = machines . category_id where categories . industry_id = 1)

4. о, извините, это моя ошибка, я обновлю ответ.

5. Спасибо, я смог получить результаты, используя ваш ответ, но с небольшим изменением, как показано ниже $industry = Industry::where(«slug»,»=»,$industry_slug)-> first(); $ categories = $industry-> categories()-> pluck(‘id’); $machines = Machine::whereHas(‘categories’, функция ($q) использует ($categories) { возвращает $q->Где(‘id’, $categories); })->разбиение на страницы(20);

Ответ №2:

$categories = $industry->categories()-> pluck(«id»); $machines = App Machine::query()->Где(‘category_id’, $categories)-> get();

Комментарии:

1. Я должен хранить «category_id» в таблицах машин, чтобы это работало. Чего я не могу, потому что у меня много-много отношений между категориями и машинами. Что достигается с помощью сводной таблицы

2. Если вы используете полиморфную операцию morphToMany, morphedByMany, вы можете справиться с этим эффективно. Вы можете последовать примеру — itsolutionstuff.com/post /…