【问题标题】:Use raw $value in hasMany relationships in Laravel 5在 Laravel 5 的 hasMany 关系中使用原始 $value
【发布时间】:2026-02-01 05:50:01
【问题描述】:

我有一个如下所示的课程:

<?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 显示为整数,这对最终用户无用。

有没有办法拥有这样的访问器,但仍然能够根据从数据库中出来的值进行连接?

【问题讨论】:

标签: laravel laravel-5 eloquent accessor mutators


【解决方案1】:

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

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

现在您的关系将毫无问题地正常运行,并且以人类可读的格式显示 IP,您可以使用 $property-&gt;dotted_ip 而不是 $property-&gt;ip(显然您可以使用比 dotted_ip 更好的名称来表示人类可读的 ip)。

这还使您受益于您可以轻松访问原始值和由long2ip 处理的值,因此您可以随时使用它们中的任何一个。

【讨论】:

  • 我想我可以做这样的事情,甚至public function states() {return State::where('property_ip', ip2long($this-&gt;ip));}。我希望让它保持清洁一点。
最近更新 更多