laravel 中的whereHas 方法可以写成闭包函数的形式吗

$data = Programme::
        select(['id', 'user_id', 'teacher_id', 'start_time', 'status', 'audition', 'evaluate', 'remarks']);

        if ($subject_id) {

            $data = $data->
            whereHas('appointment', function ($query) use ($subject_id) {
                $query->whereHas('subject', function ($query) use ($subject_id) {
                    $query->where(['subject_id' => $subject_id]);
                });
            });
        }

        $data = $data->
        with(['student' => function ($query) {
            $query->select(['id', 'name']);
        }])->
        with(['user' => function ($query) {
            $query->select(['id', 'name']);
        }])->
        with(['appointment' => function ($query) {
            $query->select(['id', 'teacher_time_id', 'subject_id', 'subject_level_id'])->
            with(['subjectLevel' => function ($query) {
                $query->select(['id', 'level_name']);
            }]);
            $query->with(['subject' => function ($query) {
                $query->select(['id', 'subject_name']);
            }]);
        }])->where($where)->whereBetween('start_time', [$start_time, $end_time])->orderBy('start_time', 'asc')->simplePaginate($limit)->toArray();

        return $data;

目前代码是这样的 中间有个if (subject) 为了避免报错 我使用了$data = $data->xxx 这样的形式 问下还有其他方法吗

$data = Programme::
        select(['id', 'user_id', 'teacher_id', 'start_time', 'status', 'audition', 'evaluate', 'remarks'])->

        whereHas('appointment', function ($query) use ($subject_id) {
            if ($subject_id) {
                $query->whereHas('subject', function ($query) use ($subject_id) {
                    $query->where(['subject_id' => $subject_id]);
                });
            }
        })->

        with(['student' => function ($query) {
            $query->select(['id', 'name']);
        }])->
        with(['user' => function ($query) {
            $query->select(['id', 'name']);
        }])->
        with(['appointment' => function ($query) {
            $query->select(['id', 'teacher_time_id', 'subject_id', 'subject_level_id'])->
            with(['subjectLevel' => function ($query) {
                $query->select(['id', 'level_name']);
            }]);
            $query->with(['subject' => function ($query) {
                $query->select(['id', 'subject_name']);
            }]);
        }])->where($where)->whereBetween('start_time', [$start_time, $end_time])->orderBy('start_time', 'asc')->simplePaginate($limit)->toArray();

写成这种形式并不能满足需求 ╮(╯▽╰)╭

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案
->when($subject_id,function($query) use ($subject_id){
   $query->whereHas('appointment.subject', function ($query) use ($subject_id) {
            $query->where(['subject_id' => $subject_id]);
        })
})
->with(["a"=>function($query){},"b"=>function($query){}])
2年前 评论
Nymph (楼主) 2年前
讨论数量: 1
->when($subject_id,function($query) use ($subject_id){
   $query->whereHas('appointment.subject', function ($query) use ($subject_id) {
            $query->where(['subject_id' => $subject_id]);
        })
})
->with(["a"=>function($query){},"b"=>function($query){}])
2年前 评论
Nymph (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!