Как прикрепить последние записи относительно eloquent в Laravel - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть таблица групп, таблица сообщений и таблица пользователей. Таблица сообщений принадлежит одному пользователю и превращается в группу. таблица групп принадлежит одному пользователю и сообщениям 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"
  }
}

1 Ответ

0 голосов
/ 29 апреля 2018

Я бы использовал аксессор для этого.

например. В вашей группе модель

protected $appends = ['last_message'];


public function getLastMessageAttribute()
{
    return $this->messages->orderBy('id', 'desc')->first();
}

Вы также можете использовать orderBy с created_at вместо id

Затем вы можете получить его, используя это в качестве примера:

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