PHPackages                             codewiser/belongs-to-many - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. codewiser/belongs-to-many

ActiveLibrary[Database &amp; ORM](/categories/database)

codewiser/belongs-to-many
=========================

Extended BelongsToMany for Laravel

v1.1.4(9mo ago)030MITPHP

Since Mar 24Pushed 9mo ago2 watchersCompare

[ Source](https://github.com/C0deWiser/belongs-to-many)[ Packagist](https://packagist.org/packages/codewiser/belongs-to-many)[ RSS](/packages/codewiser-belongs-to-many/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (3)Versions (8)Used By (0)

Extended BelongsToMany
======================

[](#extended-belongstomany)

As we know, `BelongsToMany` relation connects two models with a pivot table between. In simple cases, the pivot table has just two columns — foreign keys. In more complex cases, the pivot table has additional columns, and we want to constrain relation with pivot values.

**The problem is**, when we use `whereHas` method on `BelongsToMany` relation, the callback receives `Builder` instance, not `Relation` instance. So we can't use `wherePivot*` methods...

Take a look on examples.

Here we deal with a `Relation` instance:

```
$user->organizations()->wherePivot('role', 'accountant');
```

But here we deal with a `Builder` instance:

```
User::query()
    ->where('users.role', 'superuser')
    ->whereHas('organizations', fn(Builder $builder) => $builder
        ->where('organization_user.role', 'accountant')
    );
```

Here we enforced to use qualified column names to escape ambiguity.

**The solution is** to receive `Relation` instance into callback.

We introduce a `HasPivot` trait to use it with custom builders.

With that trait, all `*has` builder's methods, such as `whereHas`, `whereDoesntHave`, etc., will send to a callback not a `Builder` instance, but `BelongsToMany` object, so you allowed to use any `wherePivot*` methods to constrain an intermediate query.

You may apply the trait to a custom builder:

```
use Codewiser\Database\Eloquent\Traits\HasPivot;
use Illuminate\Database\Eloquent\Builder;

/**
 * @extends Builder
 */
class UserBuilder extends Builder
{
    use HasPivot;
}
```

If you don't plan to use custom builder, anyway you should apply extended builder to a model. This extended builder already carries the trait.

```
use Codewiser\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Attributes\UseEloquentBuilder;
use Illuminate\Database\Eloquent\Model;

#[UseEloquentBuilder(Builder::class)]
class User extends Model
{
    //
}
```

> Trait fires only on `BelongsToMany` relations. All other relation types, such as `BelongsTo`, `HasMany`, etc., keeps their original behaviour.

Also, this package provides a new method for `BelongsToMany` class (extended with a macro). The `pivot` method provides access to a pivot builder for you to build intermediate query.

Take a look on examples after applying `HasPivot` trait.

Here we deal with a `Relation` instance:

```
$user->organizations()->wherePivot('role', 'accountant');

$user->organizations()->pivot(
    fn(Builder $pivotBuilder) => $pivotBuilder->where(
        $pivotBuilder->qualifyColumn('role'),
        'accountant'
    )
);
```

And here we deal with a `Relation` instance too:

```
Organization::query()->whereHas('users',
    fn(BelongsToMany $builder) => $builder->wherePivot('role', 'accountant')
);

// If you use pivot model with a custom builder:
Organization::query()->whereHas('users',
    fn(BelongsToMany $builder) => $builder->pivot(
        fn(MyPivotBuilder $pivotBuilder) => $pivotBuilder->where(
            $pivotBuilder->qualifyColumn('role'),
            'accountant'
        )
    )
);
```

Implementation
--------------

[](#implementation)

You either MUST use `Codewiser\Database\Eloquent\Builder` builder for both models that consists in `BelongsToMany` relation.

Or you MUST use custom builders with `\Codewiser\Database\Eloquent\Traits\HasPivot` trait applied.

This is applicable to `MorphToMany` relations too.

###  Health Score

31

—

LowBetter than 66% of packages

Maintenance58

Moderate activity, may be stable

Popularity7

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~32 days

Recently: every ~1 days

Total

7

Last Release

274d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1220316?v=4)[Michael Michaelson](/maintainers/Cellard)[@Cellard](https://github.com/Cellard)

---

Top Contributors

[![Cellard](https://avatars.githubusercontent.com/u/1220316?v=4)](https://github.com/Cellard "Cellard (11 commits)")

---

Tags

belongs-to-manyeloquentlaravelpivot

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/codewiser-belongs-to-many/health.svg)

```
[![Health](https://phpackages.com/badges/codewiser-belongs-to-many/health.svg)](https://phpackages.com/packages/codewiser-belongs-to-many)
```

###  Alternatives

[anourvalar/eloquent-serialize

Laravel Query Builder (Eloquent) serialization

11223.5M33](/packages/anourvalar-eloquent-serialize)[statamic-rad-pack/runway

Eloquently manage your database models in Statamic.

135224.7k7](/packages/statamic-rad-pack-runway)[api-platform/laravel

API Platform support for Laravel

58171.5k14](/packages/api-platform-laravel)[duncanmcclean/statamic-cargo

Comprehensive e-commerce addon for Statamic. Build bespoke e-commerce sites without the complexity.

3416.9k](/packages/duncanmcclean-statamic-cargo)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
