Aug 29, 2022
0
Level 2
Query last 5 entries of relationship
Hi all, let me give you some context of my problem. I need to query for conversations who are older than two days, have 20+ messages, and where at least one of the last five messages has to be sent by a real user. Currently my query looks like this:
Conversation::where('created_at', '<', now()->subDays(2))
->withCount('messages')
->having('messages_count', '>=', 20)
->whereHas('lastFiveMessages', function (Builder $query) {
$query->whereHas('sender', function (Builder $query) {
$query->notFictitious();
});
})->get();
but this query all messages for sender not fictitious not only last five, I believe because this lastFiveMessages relationship is not possible to be like this
Conversation model:
/**
* @return HasMany
*/
public function messages(): HasMany
{
return $this->hasMany(Message::class);
}
/**
* @return HasMany
*/
public function lastFiveMessages(): HasMany
{
return $this->hasMany(Message::class)->latest()->take(5);
}
Message model:
/**
* @return BelongsTo
*/
public function sender(): BelongsTo
{
return $this->belongsTo(Profile::class, 'sender_profile_id');
}
Profile mode:
/**
* Scope a query to only include non-fictitious profiles.
*
* @param Builder $query
* @return Builder
*/
public function scopeNotFictitious(Builder $query): Builder
{
return $query->whereNotNull('user_id');
}
Does anybody have some idea how I can tackle this?
Thanks!
Please or to participate in this conversation.