首页 > 解决方案 > 如何访问laravel中的相关表

问题描述

我有一些相关的模型。Auser可以属于许多groups,并且groups 可以有任意数量的siteCensuses。我想运行一个查询,但将结果限制为仅允许他查看的那些 siteCensus。为了做到这一点,我必须知道给定是否在 a的id列表中。模型和表的命名是可预测的。usersiteCensus

我试图设置这样的关系:

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

但没有运气。我尝试的另一件事是:

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

这确实为我提供了所有siteCensuses 的列表,但我不能轻松地仅提取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');
    }

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

标签: phplaraveleloquent

解决方案


如果我理解正确的话..你想要用户足够简单的 $site_census_ids:

$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_census”、“groups”正确


推荐阅读