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()可以接受复合表表达式。