与belongsstoMany进入遥远的关系

时间:2018-01-11 21:11:04

标签: laravel laravel-5 eloquent

因此每个用户可以拥有多个页面,每个页面可以拥有多个用户(分配了一个角色),每个页面都可以拥有一个作业。现在,我正在获取用户拥有的页面,如下所示:

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 个答案:

答案 0 :(得分:0)

使用whereHas()方法:

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

我认为这些关系是定义的。如果没有,请定义它们。在Pages模型中:

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

Jobs模型中:

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

如果您不遵循naming conventions,则还需要将数据透视表名称和外键名称添加到这些关系定义中。