2017-02-20 143 views
6

我在laravel以下型号:查询许多一对多在Laravel关系,同时限制关系存在

TheJobs 
- id 
- description 
- created_at 
- deleted_at 
- updated_at 

TheSeries 
- id 
- title 
- description 
- created_at 
- deleted_at 
- updated_at 


TheMovies 
- id 
- title 
- description 
- created_at 
- deleted_at 
- updated_at 


mSeriesJobs 
- seriesID 
- jobID 

mMoviesJobs 
- movieID 
- jobID 

这里有关系的TheJobs

public function TheSeries() { 
    return $this->belongsToMany('App\Models\TheSeries', 'mSeriesJobs', 'jobID', 'seriesID'); 
    } 

    public function TheMovies() { 
    return $this->belongsToMany('App\Models\TheMovies', 'mMoviesJobs', 'jobID', 'movieID'); 
    } 

这里有关系TheSeries

public function TheJobs() { 
    return $this->belongsToMany('App\Models\TheJobs', 'mSeriesJobs', 'seriesID', 'jobID'); 
    } 

同为电影。

我想:

  • 得到所有TheSeries工作。
  • 获得所有TheMovies工作。
  • 使用TheSeriesTheMovies数据获取所有作业。

要澄清一个问题:

我需要一个简单的雄辩查询这将选择至少有一个TheJobs所有TheSeries

+0

你能张贴的关系方法也? – xhulio

+0

@xhulio刚刚更新了 – Coder

+0

你还可以解释一下你想要检索的内容吗?我的意思是,当你说'TheSeries'作业时,你的意思是只有系列作品集或操纵的作品集,这些作品应该返回满足 – xhulio

回答

0

在工作模式:

public function series() 
{ 
    return $this->hasMany('App\Series'); 
} 

系列型号:

public function jobs() 
{ 
    return $this->belongsToMany('App\Job'); 
} 

得到所有TheSeries工作:

$series = Series::whereHas('jobs')->get(); 
$seriesJob = $series->jobs; 
+0

我需要'TheSeries'的所有工作,这是行不通的。 – Coder

+0

编辑答案 –

+0

这会找到Series.id = 1的所有工作。我需要所有至少有工作的系列。 – Coder

0

有2种方式来做到这一点。第一个是使用像你已经开始的雄辩关系。为了得到一个系列中所有您需要做的所有工作是:

$seriesCollection = TheSeries::all(); 
$seriesCollection->TheJobs(); 

第二种方法是在我看来更好。您将使用访问器来检索您想要的内容。 因此,在该系列机型,让所有相关的一系列的作业只是做到以下几点:

public function getSeriesJobsAttribute(){ 
    $job_series = DB::table('mSeriesJobs')->where('seriesID', $this->attributes['id'])->get(['jobID']); 
    $job = TheJobs::whereIn('id', $job_series)->get(); 
    return $job; 
} 

,然后在你看来只是通过$seriesCollection->series_jobs迭代,而在你的控制器,你只检索$seriesCollection;

+0

当我尝试你的第一个例子时,它说TheJobs()方法不存在:( – Coder

+0

you sho uld在你的系列模型 – xhulio

+0

中包含了该方法,但我没有包括,但是它不起作用,因为有多个记录。 – Coder

1

从我所搜集的内容中,我相信您正在寻找“查询关系存在”(即Laravel Doc中的措辞)访问模型的记录,同时基于存在关系来限制结果。

在这种情况下,如果你需要一个简单的雄辩的查询,将选择至少有一个TheJobs所有TheSeries,我相信你可以试试has

$TheSeries = App\TheSeries::has('TheJobs')->get(); 

另一种方式应太,就业:

$TheJobs = App\TheJobs::has('TheSeries')->get(); 

假设:所有模型关系都已被正确定义。

你可以找到更多关于“有”在这里:https://laravel.com/docs/5.4/eloquent-relationships(在网页中搜索“查询的关系存在”请)