Laravel, как написать поисковый запрос с несколькими условиями, но где записи под одним и тем же пользователем - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть база данных с товарными запасами. Также у меня много пользователей, где продукты принадлежали разным пользователям. Поэтому мне нужно написать запрос с несколькими условиями, где поиск должен быть в разных столбцах таблицы, так что это будет пара ->orWhere() операторов. Но для поиска нужно найти все товары, которые принадлежали одному и тому же пользователю. Но если у меня много ->orWhere() условий, запрос начинает поиск товаров у других пользователей, где другие условия запроса совпадают ("title" или "product_number").

Так как я могу изменить свой код, где я могуполучить все продукты с ключевым словом поиска, где продукты под тем же пользователем?

Вот мой код:

public function searchProduct(Request $search){
    $search_item = $search->search;
    $user = User::where('id', Auth::user()->id)->first();
    $inventory = Inventory::where('client_id', $user->client_id)
                            ->where('product_number', 'like', "%{$search_item}%")
                            ->orWhere('title', 'like', "%{$search_item}%")
                            ->orWhere('other_product_numbers', 'like', "%{$search_item}%")
                            ->with(['deliveryRecord', 'orderInRecord', 'sellRecord'])
                            ->paginate(50);

    $cleint_currency = SettingsClientCurrency::where('client_id', $user->client_id)->first();

    $inventory_products = Inventory::where('client_id', $user->client_id)->with('orderInRecord')->get();
    $inventory_total = 0;
    foreach ($inventory_products as $product) {
        $ordersin = $product->orderInRecord;
        foreach ($ordersin as $orderin) {
            $inventory_total += $orderin['price'] * $orderin['units'];

        }
    }

    return view('layouts.inventory.inventory')
            ->with('inventory', $inventory)
            ->with('inventory_total', $inventory_total)
            ->with('cleint_currency', $cleint_currency)
            ->with('user', $user);
}

1 Ответ

2 голосов
/ 09 ноября 2019

Вы можете использовать два предложения where с функцией обратного вызова во втором предложении where. это даст желаемый результат

$inventory = Inventory::where('client_id', $user->client_id)
                       ->where(function ($query) use ($search_item) {
                           $query->where('product_number', 'like', "%{$search_item}%")
                                 ->orWhere('title', 'like', "%{$search_item}%")
                                 ->orWhere('other_product_numbers', 'like', "%{$search_item}%");
                       })
                       ->with(['deliveryRecord', 'orderInRecord', 'sellRecord'])
                       ->paginate(50);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...