使用查询范围但具有不同的查询模型 - Laravel

时间:2016-07-23 13:31:50

标签: php mysql laravel laravel-5.2

用户可以注册多个锦标赛和 每个锦标赛都有一个每个用户的分数记录。

Relationship Diagram

我在分数表中保留了user_id以保持记录的唯一性。

我有这个查询:

$tournaments = DB::table('tournaments')
        ->join('scores','tournaments.id','=','scores.tournament_id')
        ->select('tournaments.*','scores.score','scores.tees')
        ->where('t_date','<',Carbon::today())
        ->where('scores.user_id',$request->user()->id)
        ->get();

我想避免连接,并使用查询范围重用where子句'(t_date < Carbon::today())'

所以,这是我提出的查询:

//This is in Tournament Model
public function scopeUpcoming($query)
{
        return $query->where('t_date','>',Carbon::today());
}

$query = Score::with('tournaments')
         ->upcoming()
         ->where('user_id',$request->user()->id)
         ->get();

但是scopeUpcoming()使用$ query并且没有&#39; t_date&#39;在得分表中,所以我需要以某种方式访问​​锦标赛表并对其进行查询。反之亦然我不能使用Tournament ::(&#39;得分&#39;),因为没有&#39; user_id&#39;在锦标赛的桌子上,所以我无法获得特定的用户。

1 个答案:

答案 0 :(得分:0)

你说你不能跟

一起去
  

Tournament::with('scores')锦标赛表中没有user_id所以我无法获得特定用户。

实际上,您仍然可以使用with方法,并且可以使用闭包来过滤项目:

Tournament::with(['scores' => function($query) use ($user_id) {
    $query->where('user_id', $user_id);
});

你也说过:

  

我需要以某种方式访问​​锦标赛表并对其进行查询

您可以使用相同的代码来修改当前的查询链

$query = Score::with(['tournaments' => function($query) {
             $query->with('t_date, /**/); // Do your stuff here.
         ])
         ->upcoming()
         ->where('user_id',$request->user()->id)
         ->get();

希望这能照亮你的情况。