Reputation: 2051
I have some related models. A user
can belong to many group
s and group
s can have any number of siteCensus
es. 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 siteCensus
es. 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 siteCensus
es, 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
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
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