【问题标题】:Using Query Scope but with different query model - Laravel使用查询范围但具有不同的查询模型 - Laravel
【发布时间】:2016-07-23 22:32:31
【问题描述】:

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

我将 user_id 保存在 Score 表中以保持记录的唯一性。

我有这个查询:

$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 &lt; 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 并且 Score 表中没有 't_date',所以我需要以某种方式访问​​锦标赛表并对其进行查询。反之亦然,我不能使用 Tournament::with('scores'),因为 Tournament 的表格中没有 'user_id',所以我无法获取特定用户。

【问题讨论】:

  • 那么避免加入的原因是什么?
  • 我的控制器中有很多连接,我发现连接和原始查询是一种 hack,我很少使用 Eloquent 模型。我想以设计使用的方式学习 MVC 框架。我试图避免单/多连接,并希望更有效地使用雄辩的关系。

标签: php mysql laravel laravel-5.2


【解决方案1】:

你说你不能一起去

Tournament::with('scores') 在 Tournament 的表中没有 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();

希望这能照亮你的案子。

【讨论】:

  • 我现在真的很困惑。什么是查询范围,什么是控制器?在哪里添加即将到来的Scope()?你能解释一下或显示什么位在哪里吗?我尝试了很多选择
  • 这是我得到的:[{"id":1,"tournament_id":2,"user_id":2,"score":45,"tees":"championship","tournaments ":null}] 锦标赛结果似乎是空的,而有锦标赛 ID:2,它显示为空?而不是。 $query = Score::with(['tournaments' => function($query) use ($user_id) { $query->where('t_date','where('user_id',$request->user()->id) ->get();
  • 等等,等等,“范围函数”是你在模型上添加的东西。在控制器中,您可以放置​​所有逻辑(在您的情况下为查询)。
猜你喜欢
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多