laravel 4将ip地址保存到模型中

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 / < >

  • *柱过程中也readable -胰岛素。不需要为conversions当设置的值或querying行出对viewing。
  • 缺点: P / < >

  • 它的用途的更多的空间比选项2,3几乎在大时代的现实。但我不会担心得太多,除非你是IT规划有百万之rows。
  • 选项2:使用BLOB柱过程中 P / < >

    20世纪euantorano @提供的链接到的IP地址storing在mysql数据库,你可能是商店的IP级二进制来拯救一些空间。 P / < >

    "simplest答案会使用到: P / < >

    1
    $table->binary('ip_address');

    优点: P / < >

  • 商店在二进制的IP addresses会拯救你一些空间。
  • 缺点: 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 / < >

  • 拯救compared选项1到太空
  • 更好的性能compared到选项2分贝
  • 缺点: P / < >

  • 2像选项,你需要任何manually convert背和四之间的二进制和胰岛素- readable字符串,或使用eloquent模型与对custom accessor / mutator,我将demonstrate下面的。
  • 额外的信贷:给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 / < >

    你需要改变从binary(16)varbinary(16)如果你想交易与两种ipv4和IPv6在相同的领域。 P / < >

    但如果你需要交易的唯一的IP V4只是INT UNSIGNED P / < >

    如果你想交易的唯一的IP V6发动机binary(16) P / < >

    裁判:mysql -选择IP V4 / V6发动机,inet _ pton AMP bin2hex &; P / < >

    ref2:https:/ / / / / / 2126472 5133610 stackoverflow.com P / < >