laravel 4 saving ip address to model
我正在尝试使用Laravel4将用户IP地址保存到我的数据库中。我找到了以下函数,它返回一个字符串
1 | Request::getClientIp() |
我如何将此存储在我的模型中?只是一根绳子还是有更有效的方法?
1 | $table->string('ip_address'); |
选项:1用varchar(45)柱过程中 P / < >
考虑的discussion在另一个问题,所以最大长度之textual representation一个IPv6的地址吗?,最大长度为45当IPv6也包括"ipv4隧道特征。 P / < >
因此,在更安全的迁移命令会: P / < >
1 | $table->string('ip_address', 45); |
优点: P / < >
缺点: P / < >
选项2:使用BLOB柱过程中 P / < >
20世纪euantorano @提供的链接到的IP地址storing在mysql数据库,你可能是商店的IP级二进制来拯救一些空间。 P / < >
"simplest答案会使用到: P / < >
1 | $table->binary('ip_address'); |
优点: P / < >
缺点: P / < >
你将需要convert的IP地址到二进制字符串的第一使用的东西像php的inet _ pton()。*柱过程中不会直接readable由于它stored在二进制格式。你会看到奇怪的字符数或空白,如果想query出来直接。你可能想看我的方式到商店和retrieve的IP地址在下面的选项3。 P / < >
"query builder在laravel,despite的方法被称为二进制,实际上会创建一个BLOB柱过程中为你。BLOB也stored隔断表,出行buffer,这可能意味着较低的性能。和有真的是不是问题的原因不是用二进制型柱过程中,因为我们知道IP addresses难道,长为BLOB成为必要。 P / < >
选项:使用3 varbinary(16)柱过程中 P / < >
laravel的query builder产生BLOB柱过程中的农药的例子在选项2。如果你是用mysql,你会想用varbinary(16)代替BLOB为更好的性能。 P / < >
迁移脚本: P / < >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class CreateMyLogsTable extends Migration { public function up() { Schema::create('my_logs', function(Blueprint $table) { $table->increments('id'); }); DB::statement('ALTER TABLE `my_logs` ADD `ip_address` VARBINARY(16)'); } public function down() { DB::statement('ALTER TABLE `my_logs` DROP COLUMN `ip_address`'); Schema::drop('my_logs'); } } |
显然是唯一重要的海岸的分贝以上::statement(……)。我们需要使用原queries年代泰勒otwell suggested。感觉到自由创造的休息的表你的方式。 P / < >
从这里你可以使用php的inet _ pton()和inet _ ntop()的IP地址到convert到二进制字符串,反之亦然。 P / < >
优点: P / < >
缺点: P / < >
额外的信贷:给custom eloquent accessor / mutator(可选的): P / < >
在这里,在我找到eloquent真的useful。你可以设定你自己的accessor / mutator给你eloquent模型,你可以让你的通过/设定模型的可变usual审级。 P / < >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class MyLog extends Eloquent { public $timestamps = false; public function getIpAddressAttribute($value) { return inet_ntop($value); } public function setIpAddressAttribute($value) { $this->attributes['ip_address'] = inet_pton($value); } } |
现在,如果你做的: P / < >
1 2 3 | $log = new MyLog; $log->ip_address = '192.168.0.1'; $log->save(); |
"IP地址将救个二进制correctly。你可以做的: P / < >
1 2 | $log = MyLog::find(1); echo $log->ip_address; |
和它将192.168.0.1了回声。很useful! P / < >
1 | $table->string('ip_address', 39); |
因为最大长度的一个IPv6地址,39。 P / < >
ipv4将supported年代它的长度并不exceeds 15吨。 P / < >
从unnawut @。 P / < >
你需要改变从
但如果你需要交易的唯一的IP V4只是
如果你想交易的唯一的IP V6发动机
裁判:mysql -选择IP V4 / V6发动机,inet _ pton AMP bin2hex &; P / < >
ref2:https:/ / / / / / 2126472 5133610 stackoverflow.com P / < >