php получает значение переменной и добавляет его к запросу динамическим образом

#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`