'Is there a way to use the same parameter into multiple place in the same query with Eloquent? [duplicate]
I am working on a Laravel 5.7 based project in which Eloquent is used as an ORM.
I need to execute a raw SQL statement on my database. However, my query uses the same parameter into multiple places.
Here is a query example "this is not my real query it is more for explaining the question. My actual query is very complex and reuses the same parameters multiple times"
SELECT * FROM table
WHERE a BETWEEN :from AND :to
AND c > :from
AND d < :to
I am expecting the following to work
$resorces = DB::select('SELECT * FROM table
    WHERE a BETWEEN :from AND :to
    AND c > :from
    AND d < :to', ['from' => '2017-01-01 00:00:00', 'to' => '2018-10-01 00:00:00']);
But that is giving me the following error
SQLSTATE[HY093]: Invalid parameter number
How can I re-use the same parameters multiple places in the same query using Eloquent?
Solution 1:[1]
Would something like this work for you?
$from = '2017-01-01 00:00:00';
$to = '2018-10-01 00:00:00';
$resorces = DB::select('SELECT * FROM table
    WHERE a BETWEEN ? AND ?
    AND c > ?
    AND d < ?', [$from, $to, $from, $to]);
Solution 2:[2]
How about this?
$from = '2017-01-01 00:00:00';
$to = '2018-10-01 00:00:00';
$resorces = DB::table('table')
    ->whereRaw('a BETWEEN ? AND ?', [$from, $to])
    ->whereRaw('c > ?', [$from])
    ->whereRaw('d < ?', [$to])
    ->get();
Solution 3:[3]
Create a Dynamic Query Scopes in your Model.
public function scopeQUERY ($query, $value1, $value2){
      $query = DB::(YOUR QUERY);
      return $query;
}
Your Controller
public function hello(Model name $Modelname){
         $query = $Modelname->QUERY($value1, $value2);
}
Documentation https://laravel.com/docs/5.7/eloquent#query-scopes
Solution 4:[4]
Recently i figured out how to do what you want.
I got the answer here.
You need to add the option ATTR_EMULATE_PREPARES to your database connection, just like the following:
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
                PDO::ATTR_EMULATE_PREPARES => true,
            ]) : [],
        ],
That works fine for me. Please let em know if it works for you ?
Bests
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | matt | 
| Solution 2 | krisanalfa | 
| Solution 3 | Matteo | 
| Solution 4 | Gabriel | 
