将核心 php 查询转换为 laravel 7
Convert core php query to laravel 7
我是 Laravel 的新人。
我已经开始将我的核心 php 项目转换为 laravel 7。
我遇到了一些查询问题。
核心查询是:
if ($key == 'fuel_theft' || $key == 'soft_alert') {
if ($user_id > 1 && $user_id != 35) {
$al_sql = "SELECT count(DISTINCT(unitid)) as counter, ts.site_id FROM `tickets` ts LEFT JOIN users_site us ON us.site_id = ts.site_id WHERE ts.alert_type = '" . $key . "' AND us.userid = '" . $user_id . "' AND ts.status = 1 ";
} else if ($user_id > 1 && $user_id == 35) {
$al_sql = "SELECT count(DISTINCT(unitid)) as counter, ts.site_id FROM `tickets` ts LEFT JOIN users_site us ON us.site_id = ts.site_id WHERE ts.alert_type = 'low_drop' AND us.userid = '" . $user_id . "' AND ts.status = 1 ";
} else {
$al_sql = "SELECT count(DISTINCT(unitid)) as counter, ts.site_id FROM `tickets` ts WHERE ts.alert_type = '" . $key . "' AND ts.status = 1 ";
}
} else {
if ($user_id > 1) {
$al_sql = "SELECT count(DISTINCT(unitid)) as counter, ts.site_id FROM `tickets` ts LEFT JOIN users_site us ON us.site_id = ts.site_id WHERE ts.alert_type = '" . $key . "' AND us.userid = '" . $user_id . "' AND ts.status = 1";
} else {
$al_sql = "SELECT count(DISTINCT(unitid)) as counter, ts.site_id FROM `tickets` ts LEFT JOIN users_site us ON us.site_id = ts.site_id WHERE ts.alert_type = '" . $key . "' AND ts.status = 1";
}
}
if ($key == 'fuel_theft') {
$al_sql .= " AND ts.event_date BETWEEN '" . $f_date . "' AND '" . date(Config::get('constants.DATE')) . "'";
} else {
$al_sql .= " AND ts.event_date = '" . date(Config::get('constants.DATE')) . "'";
}
$al_sql .= " AND ts.site_id > 0 GROUP BY ts.site_id";
$al_res = DB::select($al_sql);
我也将其转换为 Laravel 构建器。
但我对 select 列有疑问。
$query->select('count(DISTINCT(unitid)) as counter', 'ts.site_id');
请让我知道我哪里错了。
我的最终查询是
$query = DB::table('tickets as ts');
$query->select('count(DISTINCT(unitid)) as counter', 'ts.site_id');
$query->leftJoin('users_site as us', 'us.site_id', '=', 'ts.site_id');
if ($key == 'fuel_theft' || $key == 'soft_alert') {
if ($user_id > 1 && $user_id != 35) {
$query->where('ts.alert_type', '=', $key);
$query->where('us.userid', '=', $user_id);
} else if ($user_id > 1 && $user_id == 35) {
$query->where('ts.alert_type', '=', 'low_drop');
$query->where('us.userid', '=', $user_id);
} else {
$query->where('ts.alert_type', '=', $key);
}
} else {
if ($user_id > 1) {
$query->where('us.userid', '=', $user_id);
}
}
if ($key == 'fuel_theft') {
$query->whereBetween('ts.event_date', [$f_date, date(Config::get('constants.DATE'))]);
} else {
$query->where('ts.event_date', '=', date(Config::get('constants.DATE')));
}
$query->where('ts.site_id', '>', 0);
$query->where('ts.status', '=', 1);
$query->groupBy('ts.site_id');
$al_res = $query->get();
错误是:找不到列:1054 'field list'
中的未知列 'count(DISTINCT(unitid))'
您需要作为原始查询传递,而不是这一行:
$query->select('count(DISTINCT(unitid)) as counter', 'ts.site_id');
你能试试这个吗:
$query->select(DB::raw('count(DISTINCT(unitid)) as counter'), 'ts.site_id');
我是 Laravel 的新人。
我已经开始将我的核心 php 项目转换为 laravel 7。 我遇到了一些查询问题。
核心查询是:
if ($key == 'fuel_theft' || $key == 'soft_alert') {
if ($user_id > 1 && $user_id != 35) {
$al_sql = "SELECT count(DISTINCT(unitid)) as counter, ts.site_id FROM `tickets` ts LEFT JOIN users_site us ON us.site_id = ts.site_id WHERE ts.alert_type = '" . $key . "' AND us.userid = '" . $user_id . "' AND ts.status = 1 ";
} else if ($user_id > 1 && $user_id == 35) {
$al_sql = "SELECT count(DISTINCT(unitid)) as counter, ts.site_id FROM `tickets` ts LEFT JOIN users_site us ON us.site_id = ts.site_id WHERE ts.alert_type = 'low_drop' AND us.userid = '" . $user_id . "' AND ts.status = 1 ";
} else {
$al_sql = "SELECT count(DISTINCT(unitid)) as counter, ts.site_id FROM `tickets` ts WHERE ts.alert_type = '" . $key . "' AND ts.status = 1 ";
}
} else {
if ($user_id > 1) {
$al_sql = "SELECT count(DISTINCT(unitid)) as counter, ts.site_id FROM `tickets` ts LEFT JOIN users_site us ON us.site_id = ts.site_id WHERE ts.alert_type = '" . $key . "' AND us.userid = '" . $user_id . "' AND ts.status = 1";
} else {
$al_sql = "SELECT count(DISTINCT(unitid)) as counter, ts.site_id FROM `tickets` ts LEFT JOIN users_site us ON us.site_id = ts.site_id WHERE ts.alert_type = '" . $key . "' AND ts.status = 1";
}
}
if ($key == 'fuel_theft') {
$al_sql .= " AND ts.event_date BETWEEN '" . $f_date . "' AND '" . date(Config::get('constants.DATE')) . "'";
} else {
$al_sql .= " AND ts.event_date = '" . date(Config::get('constants.DATE')) . "'";
}
$al_sql .= " AND ts.site_id > 0 GROUP BY ts.site_id";
$al_res = DB::select($al_sql);
我也将其转换为 Laravel 构建器。
但我对 select 列有疑问。
$query->select('count(DISTINCT(unitid)) as counter', 'ts.site_id');
请让我知道我哪里错了。
我的最终查询是
$query = DB::table('tickets as ts');
$query->select('count(DISTINCT(unitid)) as counter', 'ts.site_id');
$query->leftJoin('users_site as us', 'us.site_id', '=', 'ts.site_id');
if ($key == 'fuel_theft' || $key == 'soft_alert') {
if ($user_id > 1 && $user_id != 35) {
$query->where('ts.alert_type', '=', $key);
$query->where('us.userid', '=', $user_id);
} else if ($user_id > 1 && $user_id == 35) {
$query->where('ts.alert_type', '=', 'low_drop');
$query->where('us.userid', '=', $user_id);
} else {
$query->where('ts.alert_type', '=', $key);
}
} else {
if ($user_id > 1) {
$query->where('us.userid', '=', $user_id);
}
}
if ($key == 'fuel_theft') {
$query->whereBetween('ts.event_date', [$f_date, date(Config::get('constants.DATE'))]);
} else {
$query->where('ts.event_date', '=', date(Config::get('constants.DATE')));
}
$query->where('ts.site_id', '>', 0);
$query->where('ts.status', '=', 1);
$query->groupBy('ts.site_id');
$al_res = $query->get();
错误是:找不到列:1054 'field list'
中的未知列 'count(DISTINCT(unitid))'您需要作为原始查询传递,而不是这一行:
$query->select('count(DISTINCT(unitid)) as counter', 'ts.site_id');
你能试试这个吗:
$query->select(DB::raw('count(DISTINCT(unitid)) as counter'), 'ts.site_id');