我有一个看起来像这样的课程:
<?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显示为整数,这对最终用户来说是无用的。
有没有办法拥有这样的访问器,但仍能够根据数据库中的值加入?
答案 0 :(得分:2)
我认为你的意思是访问者而不是变异者。您应该重写访问者以使用不同的名称,例如
public function getDottedIpAttribute($value)
{
return long2ip($value);
}
现在您的关系将毫无问题地工作,并以人类可读的格式显示IP,您可以使用$property->dotted_ip
代替$property->ip
(显然,您可以使用比dotted_ip
更好的名称可读的ip)。
这样,您还可以轻松访问原始版本和处理long2ip
值的内容,这样您就可以随时使用其中任何一个。