【问题标题】:How to add collate to laravel query如何将排序规则添加到 laravel 查询
【发布时间】:2013-10-31 02:37:48
【问题描述】:

我需要像这样运行具有collate utf8_bin 的查询:

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

这仅适用于管理脚本,我不想更新表字符集本身,仅用于特定查询。

我可以使用 Eloquent ORM 执行此操作,还是需要将这个查询写出来?

【问题讨论】:

    标签: php mysql laravel laravel-4 eloquent


    【解决方案1】:

    如果它解决了你的问题,你可以这样做:

    SomeModel::whereField($value)->orderByRaw("name COLLATE utf8_bin ASC")->get();
    

    【讨论】:

    • 这对我有用。我遇到的一个问题是我需要将排序规则放在双引号中,否则会出错。我的看起来像这样:->orderByRaw('name COLLATE "C" ASC');。否则,我会收到此错误:Undefined object: 7 ERROR: collation "c" for encoding "UTF8" does not exist
    【解决方案2】:

    因为你可以配置 MySQL 驱动使用一个:

    'mysql' => array(
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'database',
        'username'  => 'root',
        'password'  => '',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),
    

    您可以为您的特定查询创建不同的连接:

    'mysql-collation' => array(
        'driver'    => 'mysql',
        'host'      => 'localhost',
        'database'  => 'database',
        'username'  => 'root',
        'password'  => '',
        'charset'   => 'utf8',
        'collation' => '<your collation>',
        'prefix'    => '',
    ),
    

    并在您的查询中使用该连接:

    $users = DB::connection('mysql-collation')->select(...);
    

    编辑:

    在模型上,您可能可以通过这种方式设置连接:

    $posts = new Word;
    $posts->setConnection('mysql-collation');
    $posts->where(...);
    

    【讨论】:

    • 无论如何要在模型上执行此操作:Word::connection('mysql-collation')-&gt;where()...?如果我这样做:DB:connection('mysql-collation')-&gt;table()...,它不允许我稍后在返回的对象上使用-&gt;save()
    【解决方案3】:

    如果您只需要将其应用于 WHERE 子句中的值:

    $value = "àBc123";
    $query->whereRaw('field_name COLLATE utf8mb4_bin = (?)', $value);
    
    • 此查询同时区分大小写区分重音
    • utf8mb4_bin 替换为您的系统上有意义的任何排序规则(例如utf8_bin)。
    • 使用 (?) 应该利用 Laravel 的查询清理。

    区分重音区分大小写:

    $value = "àBc123";
    $query->whereRaw('LOWER(field_name) COLLATE utf8mb4_bin = (?)', strtolower($value));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-08
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多