#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 joincategories
oncategories
.id
=machines
.category_id
wherecategories
.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 /…