Laravel雄辩的查询范围与使用DB :: raw的联接

时间:2019-01-25 06:35:04

标签: php laravel eloquent

我有一个无法在L5.7上使用的L5.1应用的查询范围。该作用域使用DB :: raw语句添加了一个简单的联接,如下所示:

    public function scopeLatest($query)
    {
        return $query->join(DB::raw('(SELECT patient_id, MAX(created_at) created_at FROM referral_reports GROUP BY patient_id) r2'), function ($join) {
                            $join->on('referral_reports.patient_id', '=', 'r2.patient_id');
                            $join->on('referral_reports.created_at', '=', 'r2.created_at');
                            });
    }

在L5.1上使用此作用域效果很好,但是在5.7中,查询中省略了整个联接,并且不会引发任何错误。我必须在两个应用程序上都使用DB :: enableQueryLog()才能看到结果查询是不同的。

有人知道为什么在5.7中不起作用吗?

以下是通过模型上的静态方法使用此范围的示例:

        $entries = self::inStudies($studies)
                       ->calltime($startDate, $endDate)
                       ->latest()
                       ->omitdeleted()
                       ->get();

inStudies,呼叫时间,最新消息,省略的都是查询范围。

2 个答案:

答案 0 :(得分:2)

您的范围不起作用,因为它与latest方法冲突。只需重命名此作用域,它将起作用。

latest / oldest方法已成为added in Laravel 5.3

答案 1 :(得分:-1)

您添加了使用数据库吗?在顶部?

尝试这些

public function scopeLatest($query){

return $query->join('referral_reports.patient_id', '=', 'r2.patient_id')

    ->join('referral_reports.created_at', '=', 'r2.created_at')

    ->select(DB::raw('SELECT patient_id, created_at) r2'));
}

通常我会从控制器运行分组

Model :: latest()-> max('created_at')-> groupBy('patient_id')