Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add collate to laravel query

I need to run a query having collate utf8_bin like so:

SELECT * FROM `table` WHERE `field`='value' collate utf8_bin;

This is strictly for an admin script and I don't want to update the table charset itself, just for the particular query.

Can I do this using the Eloquent ORM or do I need to write this query out?

like image 612
Rob Avatar asked Oct 22 '13 09:10

Rob


3 Answers

You can do it this way if it solves your problem:

SomeModel::whereField($value)->orderByRaw("name COLLATE utf8_bin ASC")->get();
like image 163
ddn Avatar answered Nov 05 '22 01:11

ddn


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(...);
like image 26
Antonio Carlos Ribeiro Avatar answered Nov 05 '22 01:11

Antonio Carlos Ribeiro


If you only need to apply this to the values in the WHERE clause:

$value = "àBc123";
$query->whereRaw('field_name COLLATE utf8mb4_bin = (?)', $value);
  • This query is both case sensitive and accent sensitive.
  • Replace utf8mb4_bin with whatever collation makes sense on your system (eg. utf8_bin).
  • Using (?) 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));
like image 3
Lemmings19 Avatar answered Nov 05 '22 01:11

Lemmings19