как получить доступ к соответствующей таблице в laravel - PullRequest
1 голос
/ 15 апреля 2020

У меня есть несколько родственных моделей. user может принадлежать многим group с, а group с может иметь любое количество siteCensus с. Я хочу выполнить запрос, но ограничить результаты только теми сайтами, которые ему разрешено просматривать. Чтобы сделать это, я должен знать, есть ли данный id в списке user s siteCensus es. Модели и таблицы названы предсказуемо.

Я пытался установить такое отношение:

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

, но не повезло. Я попробовал еще одну вещь:

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

, которая дает мне список всех siteCensus es, но я не могу легко извлечь только поля 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");
    }
}

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

если я вас правильно понимаю ... вам нужны $ 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' верны

0 голосов
/ 18 апреля 2020

Оказывается, у 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);
                        });
                });
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...