Php 如何访问laravel中的相关表

Php 如何访问laravel中的相关表,php,laravel,eloquent,Php,Laravel,Eloquent,我有一些相关的模型。一个用户可以属于多个组s,而组s可以有任意数量的站点普查e。我想运行一个查询,但将结果限制为只允许他查看的那些siteCensus。为了做到这一点,我必须知道一个给定的id是否在用户的站点普查列表中。模型和表的命名是可预测的 我试图建立这样的关系: $user = User::first(); $user->hasManyThrough('App\SiteCensus', 'App\GroupSiteCensus', 'group_id','id',,'sites_ce

我有一些相关的模型。一个
用户
可以属于多个
s,而
s可以有任意数量的
站点普查
e。我想运行一个查询,但将结果限制为只允许他查看的那些siteCensus。为了做到这一点,我必须知道一个给定的
id
是否在
用户的
站点普查
列表中。模型和表的命名是可预测的

我试图建立这样的关系:

$user = User::first();
$user->hasManyThrough('App\SiteCensus', 'App\GroupSiteCensus', 'group_id','id',,'sites_census_id')
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);
                });    
        });
    }
}
但是没有运气。我试过的另一件事是:

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

这确实为我提供了一个所有
siteensus
es的列表,但我不能简单地提取
id
字段来检查成员资格

最后,我需要将其插入模型中,如下所示:

$user = User::first();
$user->hasManyThrough('App\SiteCensus', 'App\GroupSiteCensus', 'group_id','id',,'sites_census_id')
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);
                });    
        });
    }
}
一些相关代码如下:

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');
    }

}

如果我没听错的话。。您需要用户拥有的$site\u census\u id 很简单:

$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');

请确保表名“sites\u census”和“groups”是正确的

事实证明,laravel确实有一种简单的方法来做到这一点。您可以直接对链接表使用
whereHas()
。就我而言,这就是我所需要的

        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);
                        });
                });
        });

您需要使用
多态关系
。我不确定多态关系如何回答此关系。一个用户可以有多个组,组可以有多个用户;组可以有多个sitecensus,sitecensus可以属于多个组。但是sitecensus不能有任何用户(至少不能直接),这是一个好的开始,但我需要的是一个用户可以访问的sitecensus列表。让我修改一下这个问题,这样我可以更清楚我已经编辑了我的答案。。。请让我知道这是否有帮助。你的回答让我找到了我需要去的地方,尽管我问得不是很好。我下面的答案是我最终使用的。我不知道whereHas()可以接受复合表表达式。