Модель Laravel foreach

У меня есть некоторые проблемы с моделью для функции whereIn. Я хочу получить данные, которые выглядят следующим образом:

[
    {
        "product_id": "8614530b-2d6b-4750-941a-ef123105eaca",
        "product_name": "product1",
        "country_id": "c4c3d36b-e32c-4687-82ed-afdff7a17735",
        "country_name": "Greece"
    },
    {
        "product_id": "8614530b-2d6b-4750-941a-ef123105eaca",
        "product_name": "product1",
        "country_id": "c4c3d36b-e32c-4687-82ed-afdff7a17735",
        "country_name": "Hungary"
    },
    {
        "product_id": "2bee007f-ca28-410b-b4b4-779e7ef180b6",
        "product_name": "product2",
        "country_id": "7aa06799-f6fc-4837-9a0f-9821cd98e729",
        "country_name": "Hungary"
    },
    {
        "product_id": "2522e1f8-1bee-43ed-8e96-7bdb540dfeec",
        "product_name": "product3",
        "country_id": "7aa06799-f6fc-4837-9a0f-9821cd98e729",
        "country_name": "Hungary"
    }
]

Итак, я хочу искать заказы для каждой страны и продукта, потому что продукт 1 находится в 2 странах, а другие - только в 1 стране, поэтому они не могут видеть заказ на этот продукт в других странах. Итак, я попробовал что-то вроде этого:

    $products = UserAgent::getUserProducts(); // returns data 
    $orders = Orders::with('details.status', 'client', 'product', 'products');


        foreach ($products as $key => $permission){
             $orders->whereIn('product_name', $permission['product_name']);
             $orders->whereIn('country_id', $permission['country_id']);
        }


 return $orders->get();

и он всегда дает эту ошибку:

Аргумент 1, переданный в Illuminate \ Database \ Query \ Builder :: cleanBindings (), должен иметь тип массив, заданная строка

Есть идеи, как это исправить?


person Stefan Patka    schedule 08.06.2021    source источник


Ответы (2)


Поскольку вы используете whereIn(), вам не нужно перебирать массив. Вам нужно всего лишь pluck() массив, содержащий значения одного столбца, чтобы передать его whereIn()

$products = UserAgent::getUserProducts(); // returns data 
$orders = Orders::with('details.status', 'client', 'product', 'products')
    ->whereIn('product_name', Arr::pluck($products, 'product_name'))
    ->whereIn('country_id', Arr::pluck($products, 'country_id'));

return $orders->get();
person shaedrich    schedule 08.06.2021
comment
В этом случае у меня есть: Вызов функции-члена pluck () в массиве - person Stefan Patka; 08.06.2021
comment
@StefanPatka Сделайте $products = collect(UserAgent::getUserProducts()); или заставьте getUserProducts вернуть коллекцию - person apokryfos; 08.06.2021
comment
Вы можете использовать Arr::pluck($products, 'product_name') вместо $products->pluck('product_name') - person shaedrich; 08.06.2021
comment
@ shaedrich.as на вопрос getUserProducts возвращает json, я думаю - person John Lobo; 08.06.2021
comment
Если это json, сделайте json_decode() - person shaedrich; 08.06.2021
comment
@shaedrich. да, я думаю, ему лучше опубликовать код getUserProducts - person John Lobo; 08.06.2021
comment
Я не уверен, действительно ли это необходимо, но продолжайте, может быть, это проливает больше света на то, что происходит в коде. - person shaedrich; 08.06.2021

foreach ($products as $key => $permission){
             $orders->whereIn('product_name', [$permission['product_name']]);
             $orders->whereIn('country_id', [$permission['country_id']]);
        }

Второй аргумент для whereIn должен быть массивом

person Dri372    schedule 08.06.2021