访问以在laravel Mutator中创建数组

yyyllmsg  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(103)

我想通过调用create方法创建一个新用户,如下所示:

User::create([
      'phone_number'  => '09121231212',
      'country_code'  => 'ir',
]);

我想通过电话号码mutator中的Propaganistas\LaravelPhone包将电话号码格式更改为国际电话号码格式,如下所示:

public function phoneNumber(): Attribute
    {
        return Attribute::make(
            get: fn ($value) => (new PhoneNumber($value, $this->country_code))->formatNational(),
            set: fn ($value) => (new PhoneNumber($value, $this->country_code))->formatE164(),
        );
    }

问题是,在phone_number变元(set)中,我无法访问create数组中定义的country_code,因此在将phone_number插入数据库之前,我无法更改其格式。
另外,我不想合并country_code来请求并在mutator中得到它。有更好的解决方案吗?

vhipe2zx

vhipe2zx1#

根据文档,您可以通过向闭包添加第二个参数来访问getter中的其他属性:

public function phoneNumber(): Attribute
{
    return Attribute::make(
        get: fn ($value, $attributes) => (new PhoneNumber($value, $attributes['country_code']))->formatNational(),
    );
}

看起来您只能访问自定义造型中模型的其他属性:

use Illuminate\Contracts\Database\Eloquent\CastsAttributes;

class PhoneNumberCast implements CastsAttributes
{
    public function get($model, $key, $value, $attributes)
    {
        return (new PhoneNumber($value, $attributes['country_code']))
            ->formatNational();
    }

    public function set($model, $key, $value, $attributes)
    {
        return (new PhoneNumber($value, $attributes['country_code']))
            ->formatE164();
    }
}

相关问题