首页 > 解决方案 > Applying global scope with join replaces main table column data with joined table column data having same column name in Laravel 8

问题描述

I'm using a made up scenario, but facing similar issue.

I'm using Laravel 8 and have two models Family & Centre. Both containing common column name id.

In model Family I want to restrict families data based on centre of user logged in. For now I'm hardcoding it a dummy centre_id

Below is my booted function in Family model

protected static function booted()
    {
        static::addGlobalScope('user_access', function (Builder $builder) {
            $builder->join('centres as c1', function ($join) {
                 $join->on('families.centre_id', '=', 'c1.id');
            });
        });
    }

Now when I query Family model in a controller, it joins with Centre model and the id column of Family gets replaced with Centre model id column.

For eg:

Family has one row with id -> 100 and centre_id = 1 Centre has one row with id -> 1 and name = 'Test'

After join in booted function, I get value 1 in id when I query $family->id. $family is an instance of Family model.

Expected result : 100

I don't want to use select in booted function as there are many aggregated function I'm using which will be causing issues.

标签: laraveljoinlaravel-8global-scope

解决方案


推荐阅读