Я потратил много времени на это за последние пару дней, и вот мое решение. Он похож на эти другие, но отличается, поэтому однажды может кому-то пригодиться:
У меня есть компонент Vue, который делает запрос GET, поэтому $request->get('searchTerms')
исходит из <input name="searchTerms">
в форме отправки HTML.
Я хотел, чтобы пользователь мог контролировать, какие поля будут искать, поэтому $search_terms
— это массив столбцов для поиска.
Я хотел, чтобы, если пользователь искал «Макдональдс 604», он отфильтровывал список записей и показывал два разных совпадения для этого поиска. Одно совпадение «Макдональдс» для business_name
и одно совпадение «604» для кода города phone_number
. Это гарантировало бы, что пользователь получит все, что связано, если он знает только некоторые фрагменты.
Цель состояла в том, чтобы перебирать условия поиска, а также перебирать поля поиска (столбцы) с общей формулой, которую можно было применять из любого количества условий поиска и столбцов, динамических во время выполнения.
$search_fields = ['project_name', 'business_name', 'phone_number'];
$search_terms = explode(' ', $request->get('searchTerms'));
$query = Campaign::query();
foreach ($search_terms as $term) {
$query->orWhere(function ($query) use ($search_fields, $term) {
foreach ($search_fields as $field) {
$query->orWhere($field, 'LIKE', '%' . $term . '%');
}
});
}
$filtered = $query->get();
Я бы порекомендовал прочитать документацию по запросам для Laravel, потому что это даст вам лучшее представление об этой задаче: https://laravel.com/docs/5.6/queries
В приведенном выше коде мы используем parameter grouping
, и он изменяет характеристики алгоритма, если вы используете where
вместо orWhere
.
Бонусные факты
Я также настоятельно рекомендую протестировать ваши операторы SQL, используя $query->toSql()
и $query->getBindings()
. Вы можете поместить их вместо $query->get()
, чтобы увидеть, как будет выглядеть генерируемый оператор SQL и каковы привязки параметров. getBindings()
покажет вам, какие значения ?
находятся в toSql()
.
person
agm1984
schedule
20.09.2018