在Laravel 5中使用hasMany关系中的原始$值

时间:2017-08-23 19:19:04

标签: laravel laravel-5 eloquent accessor mutators

我有一个看起来像这样的课程:

<?php
namespace App;

use App\State;
use Illuminate\Database\Eloquent\Model;

class Property
{
    /**
    * Connection state logs connected to property
    */
    public function states() {
        return $this->hasMany('App\State', 'property_ip', 'ip');
    }

    /**
     * Always force ips to be stored as numbers and shown as strings
     * 
     * 192.168.0.2 vs 3232235522
     */
    public function setIpAttribute($value) {
        $this->attributes['ip'] = ip2long($value);
    }
    public function getIpAttribute($value) {
        return long2ip($value);
    }
}

在数据库中,所有IP都存储为整数,但它们始终显示为字符串。问题是访问者getIpAttribute()将ip转换为字符串,然后hasMany关系states尝试通过文本ip查找状态,因为它应该通过整数ip查找它。如果我杀死访问器,一切正常,但它会将IP显示为整数,这对最终用户来说是无用的。

有没有办法拥有这样的访问器,但仍能够根据数据库中的值加入?

1 个答案:

答案 0 :(得分:2)

我认为你的意思是访问者而不是变异者。您应该重写访问者以使用不同的名称,例如

public function getDottedIpAttribute($value) 
{
    return long2ip($value);
}

现在您的关系将毫无问题地工作,并以人类可读的格式显示IP,您可以使用$property->dotted_ip代替$property->ip(显然,您可以使用比dotted_ip更好的名称可读的ip)。

这样,您还可以轻松访问原始版本和处理long2ip值的内容,这样您就可以随时使用其中任何一个。