Множественный запрос Laravel (PHP/MySQL)

#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;
}