提问者:小点点

访问与belongstomy的远程关系


所以每个用户可以拥有多个页面,每个页面可以有多个用户(分配一个角色),每个页面可以有一个作业。现在,我得到了用户拥有的页面,就像这样:

user.php

/**
 * Get the pages.
 *
 * @return App\Modules\Pages\Entities\Pages
 */
public function pages()
{
    return $this->belongsToMany('App\Modules\Pages\Entities\Pages')->withTimeStamps();
}

现在,我正在尝试获取用户的作业,这些作业属于用户的所有页面

我在pages模型上有一个关系,页面可以有很多这样的工作:

页。php

/**
 * Get the jobs.
 *
 * @return App\Modules\Jobs\Entities\Jobs
 */
public function jobs()
{
    return $this->hasmany('App\Modules\Jobs\Entities\Jobs');
}

关系是这样的:

用户表

id | name | password.. etc

页数表

id | name

页数据透视表

id | pages_id | user_id

工作表

id | pages_id | name

因此,我的问题是:如何获得属于用户拥有的或与之关联的所有或任何页面的所有作业。我尝试了以下方法:

$jobs = User::with('pages.jobs')
    ->where('id', Auth::user()->id)
    ->get();

它只获取用户的表,而不是作业。

现在,我知道我可以做到以下几点,但这是资源密集型的,不是我想要的方式:

@foreach(Auth::user()->pages as $page)
    @foreach($page->jobs as $job)
        // ...
    @endforeach
@endforeach

那么,到底有没有办法通过hasmanyThrough或其他解决方案来实现这一点?


共1个答案

匿名用户

请使用where have()方法:

Job::whereHas('page.users', function($q) {
    $q->where('id', auth()->id());
})->get();

我假设这些关系是有定义的。如果没有,请定义它们。在页面中模型:

public function users()
{
    return $this->belongsToMany('App\Modules\Jobs\Entities\Users');
}

作业模型中:

public function page()
{
    return $this->belongsTo('App\Modules\Jobs\Entities\Pages');
}

如果不遵循命名约定,还需要将透视表名称和外键名称添加到这些关系定义中。