#php #mysql #laravel
Вопрос:
У меня есть таблица с именем назначения, в которой я храню идентификатор категории и идентификатор продукта, присвоенного этой категории. Подобный этому:
Запрос, который я ищу, состоит в том, чтобы получить все продукты, которые не отнесены к определенной категории. Например, если категория id=1, запрос должен будет вернуть продукты 4, 5 и 6.
Это код, который я пробовал, но я не могу достичь того, чего хочу.
$assignations = Assignation::where('category_id', $id)->orderBy('position', 'Asc')->get();
$no_variants_assigned = Variant::whereNotIn('id', function ($query) use ($assignations) {
$query->select('v.id')
->from('variants', 'v')
->where('v.id_product', $assignations->id);
})->orderBy('id_product', 'Asc')->get();
Пожалуйста, я надеюсь, что кто-нибудь сможет мне помочь.
Спасибо
Ответ №1:
Попробуйте этот код :
$id[] = 1;
$assigns = array_unique(Assignation::whereNotIn('category_id', $id)->pluck('product_id')->toArray());
$products = Product::whereIn('id', $assigns)->orderBy('id', 'Asc')->get();
return $products;
Редактировать:
Добавлена проверка категории на наличие перед получением данных, поэтому код должен быть:
$category = Category::findOrFail($id);
$assigns = array_unique(Assignation::where('category_id', $id)->pluck('product_id')->toArray());
$variants = Variant::whereNotIn('id', $assigns)->orderBy('id_product', 'Asc')->get();
Комментарии:
1. Это неверно, потому что я хочу, чтобы все продукты не были отнесены к определенной категории, и при первом запросе вы не учли, что некоторые продукты еще не могли быть отнесены ни к какой категории.
Ответ №2:
Te @Пейман Хейри ответ не то, что я хочу, но он помогает мне найти решение:
public function getCategoryVariantAssignation($id){
$category = Category::findOrFail($id);
$assignations = array_unique(Assignation::where('category_id', $id)->pluck('product_id')->toArray());
$no_variants_assigned = Variant::whereNotIn('id', $assignations)->orderBy('id_product', 'Asc')->get();
$data = ['category' => $category, 'variants' => $no_variants_assigned];
return $data;
}