【问题标题】:How to attach last records in relation with eloquent in Laravel如何在 Laravel 中附加与 eloquent 相关的最后记录
【发布时间】:2018-10-09 14:43:19
【问题描述】:

我有一个组表、消息表和用户表。 消息表属于一个用户,而 morphTo 属于一个组。 组表属于一个用户和 morphMany 消息。 我想通过最后一条消息“仅最后一条消息”获取与一个用户相关的所有组。

`users Model`
public function messages(){
    return $this->hasMany('App\Message');
}
public function groups(){
    return $this->belongsToMany('App\Group', 'group_user');
}


`Groups Model`
public function user(){
    return $this->belongsTo('App\User');
}

public function messages(){
    return $this->morphMany('App\Message', 'messagable');
}



`messages model`
public function user(){
    return $this->belongsTo('App\User');
}

public function messagable(){
    return $this->morphTo();
}

我希望结果是这样的:

{
"id": 23,
"user_id": 2,
"name": "Group1",
"description": "5656",
"img": "images/1524958644.png",
"created_at": "2018-04-28 23:37:24",
"updated_at": "2018-04-28 23:37:24",
"last_messages":{
    "id": 292,
    "user_id": 1,
    "messagable_type": "App\\Group",
    "messagable_id": 23,
    "message": "hi",
    "created_at": "2018-04-29 07:48:55",
    "updated_at": "2018-04-29 07:48:55"
  }
}

【问题讨论】:

    标签: laravel eloquent relationship


    【解决方案1】:

    我会为此使用accessor

    例如。在您的群组模型中

    protected $appends = ['last_message'];
    
    
    public function getLastMessageAttribute()
    {
        return $this->messages->orderBy('id', 'desc')->first();
    }
    

    您也可以将orderBycreated_at 一起使用,而不是id

    然后您可以使用以下示例检索它:

    Group::where('user_id',2)->first()->last_message;
    

    【讨论】:

    • 我使用了“return $this->messages->sortKeysDesc()->first();”在访问器中,我得到了我想要的东西,但还有额外的信息:(我得到了第一条消息和所有消息)。有没有办法可以隐藏所有的消息?
    • 我添加了“受保护的 $hidden = ['messages'];”在我的模型中,现在一切都很好。
    • 看来我给了你正确的答案来找到你要找的东西,你只是没有提供足够的信息。很高兴你解决了。
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 2021-04-10
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多