Установить привязки на БД :: raw - PullRequest
0 голосов
/ 28 февраля 2020

Я использую Laravel 6.0, и в настоящее время я сталкиваюсь с проблемой, когда пытаюсь связать параметры на вложенном DB:::raw:

public static function search(string $value, string $field = 'product_name'){
    // this throws an exception because the bind is not effective and so the query has a problem
    return self::where(DB::raw("lower(?)"), "like", DB::raw('lower("%?%")'))->setBindings([$field ,$value ]);
    //this work, but always return an empty set
    return self::where(DB::raw("lower(:field)", ['field'=>$field]), "like", DB::raw('lower("%:value%")', ['value'=>$value]));
}

Оба из них всегда возвращают пустую коллекцию. Может кто-нибудь сказать мне, почему или предложить обходной путь?

Если я войду в запрос, я вижу это:

QueryExecuted {#133 ▼
  +sql: "select count(*) as aggregate from `products` where lower(?) like lower("%?%")"
  +bindings: array:2 [▼
    0 => "product_name"
    1 => "a"
  ]
  +time: 1.04
  +connection: MySqlConnection {#135 ▶}
  +connectionName: "mysql"
}

1 Ответ

0 голосов
/ 28 февраля 2020

Обновление : я считаю, что вам не нужно использовать lower, потому что MySQL like будет соответствовать регистронезависимому по умолчанию, поэтому просто используйте:

return self::where($field, 'like', "%{$value}%");

Кажется, проблема в том, что двойная кавычка " ускользает от ?, я думаю, что мы можем избавиться от них, используя concat. Попробуйте whereRaw вместо:

return self::whereRaw('lower(?) like lower(concat("%", ?, "%"))', [$field, $value]);

Или:

return self::whereRaw('lower(:field) like lower(concat("%", :value, "%"))', ['field' => $field, 'value' => $value]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...