关于模型访问器的疑问

我有三张
1、订单表orders
2、用户表users
3、客户表customers

在用户表中有个手机号做了一个访问器。就是判断有没有查看手机的权限有的话就显示全部没有的话中间4位就隐藏。

现在是通过订单表去获取客户表的数据。使用的是预加载。
比如 $data = orders::where(‘uid’,’aaaa’)->with(‘users.customers’)->first()
但是我发现如果我没有查看手机号权限的时候,他是用 132****5888 这样子关联的。

我想知道怎么样避免。就是这样子如何用原始值去关联。

我现在解决的是先在orders中拿到用户的uid
然后
$user = users::where(‘uid’,’aaaa’)->first()
$mobile = $user->getRawOriginal(‘mobile’)
然后再继续其它的操作。。但是我总感觉不够优化。请问大佬们有没有更好的办法?

我尝试直接在模型关联的方法里面直接用 $this->getRawOriginal(‘mobile’)
比如下面,但是发现不行。
public function surveyer()
{
return $this->hasOne(“”, “”, $this->getRawOriginal(‘mobile’));
}

求大佬指点了

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

非必要情况下,最好不要在原始字段上使用获取器,可以使用appends增加别名字段再使用获取器代替。

1年前 评论
讨论数量: 3

看了一下源码,在 \Illuminate\Database\Eloquent\Relations\Relation::getKeys 这个方法里面处理的,但是这个方法是在 Relation 类,不是模型,所以模型里面还没发重写这个方法,而且这个方法还是一个中间层,底下还有子类,也不能通过容器替换,自己复制这个 Relation.php 改一下,然后在 bootstrap/app.php 去手动 require 这个文件。

或者去给 Laravel 提个 PR。

1年前 评论

你可以投机取巧 可以在Order模型里面这样写试试 我没去测试过 突然想到的 因为这个关联的本质是去那这个字段的值去做查询 可以弄一个临时字段

public function getOriginMobileAttribute(): string
{
     return $this->getRawOriginal('mobile') ?? '';
}

public function xxx(): HasOne
{
    return $this->hasOne(xxx::class, 'origin_mobile', 'xxxxxxx');
}
1年前 评论

非必要情况下,最好不要在原始字段上使用获取器,可以使用appends增加别名字段再使用获取器代替。

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!