mankowitz
mankowitz

Reputation: 2051

how to access related table in laravel

I have some related models. A user can belong to many groups and groups can have any number of siteCensuses. I want to run a query but limit the results to only those siteCensus that he is allowed to see. In order to do that, I have to know if a given id is in the list of a user's siteCensuses. The models and tables are named predictably.

I've tried to set a relation like this:

$user = User::first();
$user->hasManyThrough('App\SiteCensus', 'App\GroupSiteCensus', 'group_id','id',,'sites_census_id')

but no luck. Another thing I tried is this:

$user->load('groups.siteCensus')

which does get me a list of all the siteCensuses, but I can't easily extract just the id fields to check for membership.

Ultimately, I need to plug it into the model like this:

Class Patient extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('status', function (Builder $builder) {
                $site_census_ids = .......
                $builder->where(function (Builder $q) use ($site_census_ids) {
                    return $q->whereIn('sites_census_id', $site_census_ids);
                });    
        });
    }
}

Some relevant code is below:

class Group extends Model
{
    public function users()
    {
        return $this->belongsToMany("App\User");
    }

    public function siteCensus()
    {
        return $this->belongsToMany("App\SiteCensus", 'group_site_census', 'group_id', 'sites_census_id');
    }

}
class User extends Model
{
    public function groups()
    {
        return $this->belongsToMany('App\Group');
    }
}
class SiteCensus extends Model
{
    public function groups()
    {
        return $this->belongsToMany("App\Group");
    }
}

Upvotes: 1

Views: 212

Answers (2)

mankowitz
mankowitz

Reputation: 2051

It turns out that laravel actually does have an easy way to do this. You can use whereHas() with linked tables directly. In my case, this is what I needed.

        static::addGlobalScope('status', function (Builder $builder) {
                $builder->where(function (Builder $q) {
                    return $q->whereHas('siteCensus.groups.users', function ($q) {
                            $q->where('user_id', Auth::user()->id);
                        });
                });
        });

Upvotes: 0

OMR
OMR

Reputation: 12188

if i understand you correctly .. you want $site_census_ids that the user have simple enough:

$site_census_ids=$myUser->groups()
->join('group_site_census','group_site_census.group_id','=','groups.id')
->join('sites_census','sites_census.id','group_site_census.sites_census_id')
->select('sites_census.id')->get()->pluck('id');

please make sure the table names 'sites_census','groups' are correct

Upvotes: 1

Related Questions