#php #laravel
#php #laravel
Вопрос:
Я не уверен, как это сказать, но вы поймете идею из приведенного ниже кода. Используется фреймворк Laravel. Мой код выглядит так, как показано ниже:
$keywords = ProductKeyword::orderBy('name', 'asc')->pluck('name')->toArray();
if (!empty($keywords)) {
$str = '';
foreach ($keywords as $key => $keyword) {
if ($key == 0) {
$str .= "Where('description', 'like', '%' . $keyword . '%')";
} else {
$str .= "->orWhere('description', 'like', '%' . $keyword . '%')";
}
}
}
$str .= "->all()";
$items = Item::$str;
dd($items);
Мне нужно, чтобы значение $str
было добавлено к Item
модели, чтобы фактически php интерпретировал это следующим образом
$items = Item::Where('description', 'like', '%' . 'laptop' . '%')->orWhere('description', 'like', '%' . 'pc' . '%')->all();
Чтобы я мог динамически создавать предложения where.
Комментарии:
1. Код и данные — это разные вещи. Вы должны научиться правильно различать эти два параметра.
2. @CBroe: да, я согласен с вами, но мне просто интересно, есть ли что-то конкретное для этого в php, чтобы достичь того, что я пытался сделать, или что-то достаточно близкое..
Ответ №1:
Вы здесь немного усложняете. Возьмите коллекцию ключевых слов и повторите их, затем используйте orWhere()
для названия ключевых слов, и вуаля. Откройте запрос к своим элементам с помощью query()
метода, затем применяйте orWhere()
к каждой итерации. Laravel обработает остальное. После завершения вам просто нужно get()
сохранить свои данные!
$keywords = ProductKeyword::orderBy('name', 'asc')->get();
$items = Item::query();
foreach ($keywords as $key => $keyword) {
$items->orWhere('description', 'like', '%'.$keyword->name.'%');
}
$items = $items->get();
dd($items);
Обратите внимание, что если нет ключевых слов, это, по сути, станет Item::all()
, поскольку вы не применяете никаких предложений where.
Комментарии:
1. Но просто подумал though….is возможно ли добавлять подобные вещи, которые не обязательно должны быть связаны с eloquents….
2. Вы имеете в виду добавление его в виде строк, как вы пытались в своем вопросе, а затем его применение? Ну, вы можете в некоторой степени вызывать его динамически, но только имя метода. Взгляните на функции переменных в PHP . Хотя я не рекомендую использовать переменные функции, если есть способы обойти это.
Ответ №2:
вам нужно улучшить и исправить свой код:
$query = Item::query();
foreach ($keywords as $keyword) {
$query->orWhere('description', 'like', '%'.$keyword.'%');
}
$result=$query->get();
Комментарии:
1. Было бы полезно более конкретное объяснение.
2. Возможно, вы хотите объяснить, почему это «улучшает и исправляет» код, а не просто сбрасывает некоторый код?
Ответ №3:
вы используете сложный способ для достижения этого. мой ответ был бы почти таким же, как @Qirel
//prepare your query
$query = Item::query();
foreach ($keywords as $keyword) {
//loop through the keywords in the description column of Item Table match the records which will be available in the $query
$query->orWhere('description', 'like', '%'.$keyword.'%');
}
// get the records which are matched and store it in $result variable
$result=$query->get();`enter code here`