Laravel 查询构建器从原始查询语句

3

你好! 我是 Laravel 的新手。我尝试了很多方法,但仍然出现错误。我正在尝试将这个 SQL 查询转换为 Eloquent。

 Select     t.employee_code, 
            CASE WHEN t.day = '2017-08-19' THEN t.PRESENT ELSE NULL END AS `2017-08-19`,
            CASE WHEN t.day = '2017-08-20' THEN t.PRESENT ELSE NULL END AS `2017-08-20`,
            CASE WHEN t.day = '2017-08-21' THEN t.PRESENT ELSE NULL END AS `2017-08-21`,
            CASE WHEN t.day = '2017-08-22' THEN t.PRESENT ELSE NULL END AS `2017-08-22`,
            CASE WHEN t.day = '2017-08-23' THEN t.PRESENT ELSE NULL END AS `2017-08-23`,
            CASE WHEN t.day = '2017-08-24' THEN t.PRESENT ELSE NULL END AS `2017-08-24`
FROM (
select e.employee_code, 
    Cast(e_l.time_in As date) As Day,
    Case 
        WHEN e_l.time_in IS NULL THEN 'A' 
        WHEN DAYOFWEEK(e_l.time_in) In(7, 1) Then 'W'
        ELSE 'P' 
    end as PRESENT
from employee As e
left join employees_logs As e_l on e.id = e_l.employee_id)
AS t

我尝试了这种雄辩的方式。
public static function statusReport($data){
$start_date = $data['start_date'];
$end_date = $data['end_date'];
$date_array = self::getDatesFromRange($start_date, $end_date);

$query = DB::raw("(Select t.employee_code,
          CASE WHEN t.day = '$start_date' THEN t.Present ELSE NULL END AS '$start_date')");
$query->addSelect(
        DB::raw("(
            SELECT employee.id as emp_id, 
            CONCAT(employee.firstname, " ",employee.lastname) AS employee_name,
            CAST(employees_log.time_in as date) as date_given,
            CASE    WHEN employee_logs.time_in IS NULL THEN 'A'
                    WHEN leave.status_id = 4 AND leave_request.with_pay = 1  THEN 'L'
                    WHEN leave.status_id = 4 AND leave_request.with_pay = 0  THEN 'LOP'
                    WHEN DAYOFWEEK(employee_logs.time) In(7, 1) THEN 1 AS 'W' 
                    ELSE 'P' END as status
            LEFT JOIN employee_logs On employee.id = employees_logs.employee_id
            JOIN leave On employee.id = leave.emp_id
            JOIN leave_request On leave.id = leave_request.leave_id
            WHERE employee_logs.time_in BETWEEN '$start_date' AND '$end_date') As `t`"));
$data = $query->get();
return $data;       

}

这是我遇到的错误

预期输出是该查询将告诉每天员工的状态。例如,如果今天是周末,输出中将显示“W”。如果员工缺席,则显示“A”,如果出现则显示“P”。希望有人能够帮助我。提前致谢。


你遇到了什么错误,请在你的问题中加上它。 - Saroj
语法错误,在C:\xampp\htdocs\hrpayroll\api\app\Http\Models\AttendanceReportModel.php的第178行意外出现“” - user7719185
为什么你有两个 DB::raw 语句,而且你没有连接结果。我认为错误就来自这里。 - Alex Andrei
我不小心删除了addselect。谢谢@alex。现在请编辑我的代码。 - user7719185
尝试添加您页面上的确切代码。我认为您在 statusReport 函数方面出了问题。您将其添加了两次。 - Saroj
1
@404BrainNotFound,非常抱歉造成了混乱。感谢您的提醒。现在这是我正在处理的最终代码。 - user7719185
1个回答

0

首先看一下addSelect方法:

public function addSelect($column)
{
    $column = is_array($column) ? $column : func_get_args();
    $this->columns = array_merge((array) $this->columns, $column);
    return $this;
}

这只是通过与现有选定列合并来添加列。

如需更多澄清,请访问https://laravel.com/docs/5.4/queries#selects

现在我猜你会解决问题,而不使用addSelect方法。

我的参考资料this


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接