Skip to content

BelongsTo Relations break when using custom collections #53241

Closed
@SlimGee

Description

@SlimGee

Laravel Version

11.28.1

PHP Version

8.3.12

Database Driver & Version

MariaDB 11.5.2

Description

When using a custom collection on an eloquent model as suggested in the docs here, if that model is referenced as a belongsTo by other other models, it throws a TypeError because \Illuminate\Database\Eloquent\Relations\BelongsTo::match() expects an instance an Illuminate\Database\Eloquent\Collection instead of a custom collection

My suggestion is to introduce a Collection contract which Illuminate\Support\Collection must implement and that is used as the expected types on all other internal models instead of expecting a specific implementation. I think this would be best since collections are a big part of the Laravel framework.

Steps To Reproduce

Tell eloquent to use a custom collection on a model

class User extends Model
{
    /**
     * Create a new Eloquent Collection instance.
     *
     * @param  array<int, \Illuminate\Database\Eloquent\Model>  $models
     * @return \Illuminate\Database\Eloquent\Collection<int, \Illuminate\Database\Eloquent\Model>
     */
    public function newCollection(array $models = []): Collection
    {
        return new UserCollection($models);
    }
}

On another model reference that model as the belongsTo relation

class Profile extends Model
{
  public function user()
  {
   return $this->belongsTo(User::class);
  }
}

Expected behaviour

Just works

Actual Behavior

TypeError: Illuminate\Database\Eloquent\Relations\BelongsTo::match(): Argument #2 ($results) must be of type Illuminate\Database\Eloquent\Collection, Illuminate\Support\LazyCollection given, called in...

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions