I need to run a query having collate utf8_bin
like so:
SELECT * FROM `table` WHERE `field`=\'value\' collate utf8_bin;
This is
If you only need to apply this to the values in the WHERE clause:
$value = "àBc123";
$query->whereRaw('field_name COLLATE utf8mb4_bin = (?)', $value);
utf8mb4_bin
with whatever collation makes sense on your system (eg. utf8_bin
).(?)
should utilize Laravel's query sanitization.For accent sensitive but NOT case sensitive:
$value = "àBc123";
$query->whereRaw('LOWER(field_name) COLLATE utf8mb4_bin = (?)', strtolower($value));
You can do it this way if it solves your problem:
SomeModel::whereField($value)->orderByRaw("name COLLATE utf8_bin ASC")->get();
Since you can configure MySQL driver to use one:
'mysql' => array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
),
You can create a different connection for your particular query:
'mysql-collation' => array(
'driver' => 'mysql',
'host' => 'localhost',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => '<your collation>',
'prefix' => '',
),
And use that connection on your query:
$users = DB::connection('mysql-collation')->select(...);
EDIT:
On a Model, you probably will be able to set a connection this way:
$posts = new Word;
$posts->setConnection('mysql-collation');
$posts->where(...);