Поисковый запрос работает локально, а некоторые фильтры не работают в рабочей версии Laravel. ⇐ Php
-
Anonymous
Поисковый запрос работает локально, а некоторые фильтры не работают в рабочей версии Laravel.
У меня есть сценарий запроса для Laravel, который выполняет несколько алгоритмов фильтрации поиска. Все поисковые фильтры отлично работают на локальном уровне, но на производстве при вводе ключевого слова они правильно проверяют связи модели, но не проверяют данные непосредственно в таблице списков. Тот же код отлично работает на локальном компьютере, сначала я подумал, что это проблема кода, но больше не уверен.
Производственный сервер имеет следующие конфигурации: Версия сервера: 10.5.20-MariaDB-cll-lve — Сервер MariaDB Версия протокола: 10 Версия PHP: 8.0
Хотя PHPMYADMIN сообщает о глобальных настройках PHP сервера, которые отличаются от моего домена: глобальная версия PHP — 7.4.27
На моем локальном компьютере доступны следующие версии: Версия сервера: 8.0.32 — Сервер сообщества MySQL — GPL Версия протокола: 10
Вот код, выполняющий поиск.
публичные списки статических функций (Запрос $request) { пытаться{ $initialData = Листинг::query() ->выбрать( 'списки.*', 'states.name как имя_состояния', 'sub_categories.sub_category_name', 'sub_categories.is_land' ) ->leftJoin('states', 'listings.state_id', 'states.id') ->leftJoin('sub_categories', 'listings.sub_category_id', 'sub_categories.id') ->when($request->has('brand_id'))->where('brand_id', $request->brand) ->when($request->has('brand'), функция ($query) use ($request) { $query->join('brands', 'listings.brand_id', '=', 'brands.id') ->where('brands.brand_name', 'LIKE', "%{$request->brand}%"); }) ->when($request->has('listing_type'))->listingType(\strtolower($request->listing_type)) ->withCasts(['is_land' => 'логическое значение']); $результат = $initialData ->when($request->has('подкатегория'), функция ($query) use ($request) { $subcategories = Str::of($request->подкатегория)->explode(','); $query->where(function ($subquery) use ($subcategories) { /** @var string[] $subcategories */ foreach ($subcategories как $subcategory) { $subquery->orWhere('sub_categories.sub_category_name', 'LIKE', "%{$subcategory}%"); } }); }) ->when($request->has('pay_plan'), функция ($query) use ($request) { $requestedPaymentPlans = Str::of($request->pay_plan)->explode(',')->toArray(); $query->where(function ($subquery) use ($requestedPaymentPlans) { foreach ($requestedPaymentPlans как $payPlan) { $subquery->orWhereJsonContains('Payment_plan', $PaymentPlan); } }); }) ->when($request->has('space_type'), функция ($query) use ($request) { $space_type = Str::of($request->space_type)->explode(','); $query->where(function ($subquery) use ($space_type) { /** @var string[] $space_type */ foreach ($space_type как $space) { $subquery->orWhere('listings.space_type', 'LIKE', "%{$space}%"); } }); }) ->when($request->has(['min_price', 'max_price']))->where(function ($query) use ($request) { $query->whereBetween('listings.price', [$request->query('min_price'), $request->query('max_price')]); }) ->when($request->has('location'), функция ($query) use ($request) { /** @var string[] $location */ $location = Str::of($request->location)->explode(' '); $query->where(function ($subquery) use ($location) { foreach ($location как $loc) { $subquery->orWhereHas('state', function ($q) use ($loc) { $q->where('states.name', 'LIKE', "%{$loc}%"); }) ->orWhereHas('country', function ($q) use ($loc) { $q->where('countries.name', 'LIKE', "%{$loc}%"); }) ->orWhere('listings.full_address', 'LIKE', "%{$loc}%") ->orWhere('listings.city', 'LIKE', "%{$loc}%"); } }); }) ->when($request->has('ключевое слово'), функция ($query) use ($request) { /** @var string[] $keywords */ $keywords = Str::of($request->ключевое слово)->explode(' '); $query->where(function ($subquery) use ($keywords) { foreach ($keywords как $keyword) { $subquery->orWhere('listings.listing_caption', 'LIKE', "%{$keyword}%") ->orWhere('listings.listing_description', 'LIKE', "%{$keyword}%") ->orWhereHas('state', function ($q) use ($keyword) { $q->where('states.name', 'LIKE', "%{$keyword}%"); }) ->orWhereHas('country', function ($q) use ($keyword) { $q->where('countries.name', 'LIKE', "%{$keyword}%"); }) ->orWhere('listings.city', 'LIKE', "%{$keyword}%") ->orWhere('listings.full_address', 'LIKE', "%{$keyword}%") ->orWhereHas('sub_category', function ($q) use ($keyword) { $q->where('sub_categories.sub_category_name', 'LIKE', "%{$keyword}%"); }); } }); }) -> получить(); $landResults = $result->where('is_land', true); $nonLandResults = $result->where('is_land', false); $finalResult = собрать([]); $filteredNonLandResults = собрать([]); если ($nonLandResults->isEmpty()) { если ($landResults->isEmpty()) { $finalResult = $initialData->get(); } }еще { $filteredNonLandResults = $nonLandResults->when($request->has('ванные комнаты'), функция ($query) use ($request) { $query->where('listings.bathrooms', $request->ванные комнаты); }) ->when($request->has('спальни'), функция ($query) use ($request) { $query->where('listings.bedrooms', $request->bedrooms); }) ->когда($запрос->имеет('условие'), функция ($query) use ($request) { $condition = Str::of($request->condition)->explode(','); $query->where(function ($subquery) use ($condition) { /** @var string[] $condition */ foreach ($условие как $cond) { $subquery->orWhere('listings.condition', 'LIKE', "%{$cond}%"); } }); }) ->when($request->has('меблировка'), функция ($query) use ($request) { $furnishings = Str::of($request->мебель)->explode(','); $query->where(function ($subquery) use ($furnishings) { /** @var string[] $furnishings */ foreach ($furnishings как $furnishing) { $subquery->orWhere('listings.furnishing', 'LIKE', "%{$furnishing}%"); } }); }); $finalResult = $landResults->concat($filteredNonLandResults)->values()->all(); } $queryLog = DB::getQueryLog(); Журнал::информация($queryLog); вернуть $finalResult; }catch(\Exception $e) { вернуть $e->getMessage(); } } Я также повторил запрос в журнале, и он выглядит очень хорошо, на самом деле, запуская его непосредственно на ядре базы данных в рабочей среде, он приносит желаемый результат, но конечная точка возвращает очень нестабильные результаты, это работает странно способы.
Представьте, что вы ищете space_type, используя значение «частный». Я получаю результаты, затем меняю его на «общий», который также существует, он возвращает пустой массив.
Отредактировано отсюда
В рабочей среде пример журнала запросов, когда указан только параметр ключевого слова: [2023-12-07 14:28:19] Production.INFO: массив ( 0 => множество ( 'query' => 'выберите списки.*, состояния.имя как имя_состояния, sub_categories< /code>.имя_под_категории, под_категории.is_land из списков осталось присоединиться к состояниям включенным списки.state_id = states.id left join sub_categories в списках .sub_category_id = sub_categories.id где (списки.listing_caption LIKE ? или списки.listing_description LIKE ? или существует (выберите * из states, где listings.state_id = states.id и states.name LIKE ?) или существует (выберите * из < code>страны, где списки.country_id = страны.id и страны code>.имя НРАВИТСЯ ?) или списки.город НРАВИТСЯ ? или списки.полный_адрес НРАВИТСЯ ? или существует (выберите * из под_категории, где списки.sub_category_id = sub_categories.id и под_категории.имя_под_категории НРАВИТСЯ ?))', 'привязки' => множество ( 0 => '%near%', 1 => '%near%', 2 => '%near%', 3 => '%near%', 4 => '%near%', 5 => '%near%', 6 => '%near%', ), 'время' => 6,28, ), )
В локальном режиме это журнал запросов: [2023-12-07 14:38:50] local.INFO: массив ( 0 => множество ( 'query' => 'выберите списки.*, состояния.имя как имя_состояния, sub_categories< /code>.имя_под_категории, под_категории.is_land из списков осталось присоединиться к состояниям включенным списки.state_id = states.id left join sub_categories в списках .sub_category_id = sub_categories.id где (списки.listing_caption LIKE ? или списки.listing_description LIKE ? или существует (выберите * из states, где listings.state_id = states.id и states.name LIKE ?) или существует (выберите * из < code>страны, где списки.country_id = страны.id и страны code>.имя НРАВИТСЯ ?) или списки.город НРАВИТСЯ ? или списки.полный_адрес НРАВИТСЯ ? или существует (выберите * из под_категории, где списки.sub_category_id = sub_categories.id и под_категории.имя_под_категории НРАВИТСЯ ?))', 'привязки' => множество ( 0 => '%near%', 1 => '%near%', 2 => '%near%', 3 => '%near%', 4 => '%near%', 5 => '%near%', 6 => '%near%', ), 'время' => 152,35, ), )
У меня есть сценарий запроса для Laravel, который выполняет несколько алгоритмов фильтрации поиска. Все поисковые фильтры отлично работают на локальном уровне, но на производстве при вводе ключевого слова они правильно проверяют связи модели, но не проверяют данные непосредственно в таблице списков. Тот же код отлично работает на локальном компьютере, сначала я подумал, что это проблема кода, но больше не уверен.
Производственный сервер имеет следующие конфигурации: Версия сервера: 10.5.20-MariaDB-cll-lve — Сервер MariaDB Версия протокола: 10 Версия PHP: 8.0
Хотя PHPMYADMIN сообщает о глобальных настройках PHP сервера, которые отличаются от моего домена: глобальная версия PHP — 7.4.27
На моем локальном компьютере доступны следующие версии: Версия сервера: 8.0.32 — Сервер сообщества MySQL — GPL Версия протокола: 10
Вот код, выполняющий поиск.
публичные списки статических функций (Запрос $request) { пытаться{ $initialData = Листинг::query() ->выбрать( 'списки.*', 'states.name как имя_состояния', 'sub_categories.sub_category_name', 'sub_categories.is_land' ) ->leftJoin('states', 'listings.state_id', 'states.id') ->leftJoin('sub_categories', 'listings.sub_category_id', 'sub_categories.id') ->when($request->has('brand_id'))->where('brand_id', $request->brand) ->when($request->has('brand'), функция ($query) use ($request) { $query->join('brands', 'listings.brand_id', '=', 'brands.id') ->where('brands.brand_name', 'LIKE', "%{$request->brand}%"); }) ->when($request->has('listing_type'))->listingType(\strtolower($request->listing_type)) ->withCasts(['is_land' => 'логическое значение']); $результат = $initialData ->when($request->has('подкатегория'), функция ($query) use ($request) { $subcategories = Str::of($request->подкатегория)->explode(','); $query->where(function ($subquery) use ($subcategories) { /** @var string[] $subcategories */ foreach ($subcategories как $subcategory) { $subquery->orWhere('sub_categories.sub_category_name', 'LIKE', "%{$subcategory}%"); } }); }) ->when($request->has('pay_plan'), функция ($query) use ($request) { $requestedPaymentPlans = Str::of($request->pay_plan)->explode(',')->toArray(); $query->where(function ($subquery) use ($requestedPaymentPlans) { foreach ($requestedPaymentPlans как $payPlan) { $subquery->orWhereJsonContains('Payment_plan', $PaymentPlan); } }); }) ->when($request->has('space_type'), функция ($query) use ($request) { $space_type = Str::of($request->space_type)->explode(','); $query->where(function ($subquery) use ($space_type) { /** @var string[] $space_type */ foreach ($space_type как $space) { $subquery->orWhere('listings.space_type', 'LIKE', "%{$space}%"); } }); }) ->when($request->has(['min_price', 'max_price']))->where(function ($query) use ($request) { $query->whereBetween('listings.price', [$request->query('min_price'), $request->query('max_price')]); }) ->when($request->has('location'), функция ($query) use ($request) { /** @var string[] $location */ $location = Str::of($request->location)->explode(' '); $query->where(function ($subquery) use ($location) { foreach ($location как $loc) { $subquery->orWhereHas('state', function ($q) use ($loc) { $q->where('states.name', 'LIKE', "%{$loc}%"); }) ->orWhereHas('country', function ($q) use ($loc) { $q->where('countries.name', 'LIKE', "%{$loc}%"); }) ->orWhere('listings.full_address', 'LIKE', "%{$loc}%") ->orWhere('listings.city', 'LIKE', "%{$loc}%"); } }); }) ->when($request->has('ключевое слово'), функция ($query) use ($request) { /** @var string[] $keywords */ $keywords = Str::of($request->ключевое слово)->explode(' '); $query->where(function ($subquery) use ($keywords) { foreach ($keywords как $keyword) { $subquery->orWhere('listings.listing_caption', 'LIKE', "%{$keyword}%") ->orWhere('listings.listing_description', 'LIKE', "%{$keyword}%") ->orWhereHas('state', function ($q) use ($keyword) { $q->where('states.name', 'LIKE', "%{$keyword}%"); }) ->orWhereHas('country', function ($q) use ($keyword) { $q->where('countries.name', 'LIKE', "%{$keyword}%"); }) ->orWhere('listings.city', 'LIKE', "%{$keyword}%") ->orWhere('listings.full_address', 'LIKE', "%{$keyword}%") ->orWhereHas('sub_category', function ($q) use ($keyword) { $q->where('sub_categories.sub_category_name', 'LIKE', "%{$keyword}%"); }); } }); }) -> получить(); $landResults = $result->where('is_land', true); $nonLandResults = $result->where('is_land', false); $finalResult = собрать([]); $filteredNonLandResults = собрать([]); если ($nonLandResults->isEmpty()) { если ($landResults->isEmpty()) { $finalResult = $initialData->get(); } }еще { $filteredNonLandResults = $nonLandResults->when($request->has('ванные комнаты'), функция ($query) use ($request) { $query->where('listings.bathrooms', $request->ванные комнаты); }) ->when($request->has('спальни'), функция ($query) use ($request) { $query->where('listings.bedrooms', $request->bedrooms); }) ->когда($запрос->имеет('условие'), функция ($query) use ($request) { $condition = Str::of($request->condition)->explode(','); $query->where(function ($subquery) use ($condition) { /** @var string[] $condition */ foreach ($условие как $cond) { $subquery->orWhere('listings.condition', 'LIKE', "%{$cond}%"); } }); }) ->when($request->has('меблировка'), функция ($query) use ($request) { $furnishings = Str::of($request->мебель)->explode(','); $query->where(function ($subquery) use ($furnishings) { /** @var string[] $furnishings */ foreach ($furnishings как $furnishing) { $subquery->orWhere('listings.furnishing', 'LIKE', "%{$furnishing}%"); } }); }); $finalResult = $landResults->concat($filteredNonLandResults)->values()->all(); } $queryLog = DB::getQueryLog(); Журнал::информация($queryLog); вернуть $finalResult; }catch(\Exception $e) { вернуть $e->getMessage(); } } Я также повторил запрос в журнале, и он выглядит очень хорошо, на самом деле, запуская его непосредственно на ядре базы данных в рабочей среде, он приносит желаемый результат, но конечная точка возвращает очень нестабильные результаты, это работает странно способы.
Представьте, что вы ищете space_type, используя значение «частный». Я получаю результаты, затем меняю его на «общий», который также существует, он возвращает пустой массив.
Отредактировано отсюда
В рабочей среде пример журнала запросов, когда указан только параметр ключевого слова: [2023-12-07 14:28:19] Production.INFO: массив ( 0 => множество ( 'query' => 'выберите списки.*, состояния.имя как имя_состояния, sub_categories< /code>.имя_под_категории, под_категории.is_land из списков осталось присоединиться к состояниям включенным списки.state_id = states.id left join sub_categories в списках .sub_category_id = sub_categories.id где (списки.listing_caption LIKE ? или списки.listing_description LIKE ? или существует (выберите * из states, где listings.state_id = states.id и states.name LIKE ?) или существует (выберите * из < code>страны, где списки.country_id = страны.id и страны code>.имя НРАВИТСЯ ?) или списки.город НРАВИТСЯ ? или списки.полный_адрес НРАВИТСЯ ? или существует (выберите * из под_категории, где списки.sub_category_id = sub_categories.id и под_категории.имя_под_категории НРАВИТСЯ ?))', 'привязки' => множество ( 0 => '%near%', 1 => '%near%', 2 => '%near%', 3 => '%near%', 4 => '%near%', 5 => '%near%', 6 => '%near%', ), 'время' => 6,28, ), )
В локальном режиме это журнал запросов: [2023-12-07 14:38:50] local.INFO: массив ( 0 => множество ( 'query' => 'выберите списки.*, состояния.имя как имя_состояния, sub_categories< /code>.имя_под_категории, под_категории.is_land из списков осталось присоединиться к состояниям включенным списки.state_id = states.id left join sub_categories в списках .sub_category_id = sub_categories.id где (списки.listing_caption LIKE ? или списки.listing_description LIKE ? или существует (выберите * из states, где listings.state_id = states.id и states.name LIKE ?) или существует (выберите * из < code>страны, где списки.country_id = страны.id и страны code>.имя НРАВИТСЯ ?) или списки.город НРАВИТСЯ ? или списки.полный_адрес НРАВИТСЯ ? или существует (выберите * из под_категории, где списки.sub_category_id = sub_categories.id и под_категории.имя_под_категории НРАВИТСЯ ?))', 'привязки' => множество ( 0 => '%near%', 1 => '%near%', 2 => '%near%', 3 => '%near%', 4 => '%near%', 5 => '%near%', 6 => '%near%', ), 'время' => 152,35, ), )
Мобильная версия