Laravel Schema Builder:创建二进制(16)列

时间:2018-03-20 16:16:32

标签: mysql laravel laravel-5.5

使用Laravel 5.5和Mysql(10.1.19-MariaDB)

对于md5哈希,我想要一个二进制(16)列。 我们称之为colum url_hash

使用时:

MySuperClass

它会给我一个BLOB专栏。

来源:https://laravel.com/docs/5.5/migrations#creating-columns

我已经在网上看过各种各样的黑客或插件,但是最简单的一个没有任何外部插件可能会在下一次更新时中断?

干杯

3 个答案:

答案 0 :(得分:3)

扩展MySqlGrammar类,例如在app/MySqlGrammar.php

namespace App;

use Illuminate\Support\Fluent;

class MySqlGrammar extends \Illuminate\Database\Schema\Grammars\MySqlGrammar {

    protected function typeRealBinary(Fluent $column) {
        return "binary({$column->length})";
    }

}

然后使用宏添加您自己的列类型:

DB::connection()->setSchemaGrammar(new \App\MySqlGrammar());

Blueprint::macro('realBinary', function($column, $length) {
    return $this->addColumn('realBinary', $column, compact('length'));
});

Schema::create('table', function(Blueprint $table) {
    $table->realBinary('url_hash', 16);
});

答案 1 :(得分:2)

Laravel作者recommends进行DB:statement调用并运行原始SQL。

如果您正在运行迁移,则可以在Schema::create之后运行此原始SQL:

DB::statement('ALTER TABLE table_name ADD url_hash binary(16) AFTER some_column');

取决于用例,您可能需要在删除表之前运行此原始SQL以删除列:

DB::statement('ALTER TABLE table_name DROP url_hash');

答案 2 :(得分:1)

您只需将字符集设置为 binary

$table->char('url_hash', 16)->charset('binary');

在MySQL Workbench中,这实际上显示为真正的 binary 列类型,长度为16。

应该没有任何区别:https://stackoverflow.com/a/15335682/5412658