如何始终将属性附加到Laravel Eloquent模型?

aor9mmx1  于 2023-05-01  发布在  其他
关注(0)|答案(4)|浏览(92)

我想知道如何总是附加一些数据到Eloquent模型,而不需要要求它,例如,当从数据库获取帖子时,我想为每个用户附加用户信息:

{
    id: 1
    title: "My Post Title"
    body: "Some text"
    created_at: "2-28-2016"
    user:{
            id: 1,
            name: "john smith",
            email: "example@mail.com"
         }
}
s5a0g9ez

s5a0g9ez1#

经过一些搜索,我发现你只需要在你的Eloquent模型中的$appends数组中添加你想要的属性:

protected $appends = ['user'];

**更新:**如果数据库中存在该属性,则可以根据下面的David Barker's注解使用protected $with= ['user'];

然后创建一个访问器为:

public function getUserAttribute()
{

    return $this->user();

}

这样,你总是会有每个帖子的用户对象可用:

{
    id: 1
    title: "My Post Title"
    body: "Some text"
    created_at: "2-28-2016"
    user:{
            id: 1,
            name: "john smith",
            email: "example@mail.com"
         }
}
eagi6jfj

eagi6jfj2#

我发现这个概念很有趣,我学习和分享的东西。在这个例子中,我附加了id_hash变量,然后通过这个逻辑将其转换为方法。
它取第一个char并转换为大写i。即Id和下划线后字母改为大写i。即Hash
Laravel本身添加getAttribute,将它们合并在一起,得到getIdHashAttribute()

class ProductDetail extends Model
{
    protected $fillable = ['product_id','attributes','discount','stock','price','images'];
    protected $appends = ['id_hash'];

    public function productInfo()
    {
        return $this->hasOne('App\Product','id','product_id');
    }

    public function getIdHashAttribute(){
        return Crypt::encrypt($this->product_id);
    }
}

为了简化,append变量应该是这样的

protected $appends = ['id_hash','test_var'];

该方法在模型中定义如下

public function getTestVarAttribute(){
        return "Hello world!";
    }
hmmo2u0o

hmmo2u0o3#

您的数据库表不正确,您不需要追加任何可以使用关系加载的内容:
首先,你的post表应该有user_id列,它引用你的user表id列:{ id:1 user_id:1标题:“我的帖子标题”正文:“Some text”created_at:2016年2月28日
然后在你的帖子模型中,你必须基于你的user_id定义关系:

public function user() {
    return $this->belongsTo("App\Models\User", "user_id");
}

然后在get API调用中,你要做的就是加载这个关系:例如Posts::with(“user”)-〉get();

a7qyws3x

a7qyws3x4#

例如,在模型中:

protected $appends = [
    'mobile_with_code',
];

public function getFormattedMobileAttribute() {
    if (!$this->calling_code) {
        return $this->mobile;
    }

    return $this->calling_code . '-' . $this->mobile;
}

你可以正常地用物体。
鉴于:

{{mobile_with_code}}

相关问题