Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

coa989's avatar

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!

0 likes
0 replies

Please or to participate in this conversation.