сохранить предложение where в переменной и использовать его в запросе laravel

PDO не очень хорош с такими вещами. Вам нужно создать строку с вопросительными знаками динамически и вставить в запрос.

$in  = str_repeat('?,', count($in_array) - 1) . '?';
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($in_array);
$data = $stm->fetchAll();

Если в запросе есть другие заполнители, вы можете использовать следующий подход (код берется из моего PDO tutorial ):

Вы можете использовать функцию array_merge(), чтобы объединить все переменные в один массив, добавив другие переменные в виде массивов в том порядке, в каком они появляются в вашем query:

$arr = [1,2,3];
$in  = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?";
$stm = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stm->execute($params);
$data = $stm->fetchAll();

Если вы используете именованные заполнители, код будет немного сложнее, так как вам нужно создать последовательность именных заполнителей, например :id0,:id1,:id2. Таким образом, код будет выглядеть следующим образом:

// other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];

$ids = [1,2,3];
$in = "";
foreach ($ids as $i => $item)
{
    $key = ":id".$i;
    $in .= "$key,";
    $in_params[$key] = $item; // collecting values into key-value array
}
$in = rtrim($in,","); // :id0,:id1,:id2

$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params,$in_params)); // just merge two arrays
$data = $stm->fetchAll();

К счастью, для названных заполнителей нам не обязательно следовать строгий порядок, поэтому мы можем объединить наши массивы в любом порядке.

0
задан umar Aslam 17 January 2019 в 09:24
поделиться

3 ответа

это не будет работать, потому что вы сохраняете текст в строку, а вывод будет в строке, вам нужно преобразовать его в eval

$results = DB::table('product_details')  . eval ($where) .->get();
0
ответ дан sid heart 17 January 2019 в 09:24
поделиться

Я не уверен, почему ты хочешь сделать это. Следующее должно просто работать.

DB::table('product_details')
    ->where([
        'product_details.title' => $request->title
        'product_details.id' => $request->id
    ])
    ->get(); 

Теперь предположим, что у вас не всегда есть заголовок или идентификатор из запроса, вы также можете сделать это

DB::table('product_details')
    ->when($request->title, function ($query, $title) {
        return $query->where('product_details.title', $title);
    })
    ->when($request->id, function ($query, $id) {
        return $query->where('product_details.id', $id);
    })
    ->get();
0
ответ дан Mozammil 17 January 2019 в 09:24
поделиться

Вы можете использовать это, используя , если условие условие для динамического запроса

$results = DB::table('product_details')

if($request->title) {
   $results->where("product_details.title", $request->title);
}
if($request->id) {
   $results->where("product_details.id", $request->id);
}
$result->get();
0
ответ дан Jignesh Joisar 17 January 2019 в 09:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: