Я подозреваю, что вы не знакомы с тем, как where
/ whereRaw
и orWhere
/ orWhereRaw
работают вместе.
В настоящее время ваше предложение WHERE
выглядит следующим образом:
YEAR(pointages.datep) = ? and MONTH(pointages.datep) = ? and DAY(pointages.datep)>0 AND DAY(pointages.datep)<16 or `pointages`.`salarie_id` = ? or `pointages`.`chantier_id` = ?
Обратите внимание, что круглые скобки отсутствуют, означая, что любое из конечных условий может переопределить предыдущие. Вы можете легко определить, как будет выглядеть ваш запрос, используя методы построителя запросов toSql()
или dd()
.
Мне кажется, вы ищете такой запрос?
SELECT SUM(pointages.sold) AS sold, SUM(pointages.payer) AS payer,
salaries.nom, salaries.prenom, salaries.id
FROM salaries
LEFT JOIN pointages ON (pointages.salarie_id = salaries.id)
WHERE YEAR(pointages.datep) = ?
AND MONTH(pointages.datep) = ?
AND DAY(pointages.datep) > 0
AND DAY(pointages.datep) < 16
AND (
pointages.salarie_id = ?
OR pointages.chantier_id = ?
)
GROUP BY pointages.salarie_id
Сначала пара замечаний: 1) не когда-либо помещайте необработанные данные в запрос SQL, как вы делали выше. whereRaw()
метод работает с заполнителями; используй их. 2) Старайтесь по возможности избегать использования необработанных операторов. Есть вспомогательных функций для таких вещей, как вычисления даты, которые вы делаете. 3) Группировка ваших ограничений выполняется передачей замыкания в where()
/ orWhere()
. 4) Выполнение сравнения с результатами функции (как вы делаете с вашими YEAR
, MONTH
и DAY
функциями) очень неэффективно; столбец фактически становится столбцом неиндексированного текста.
Следующий код создаст запрос, эквивалентный приведенному выше, но делает проверки из запроса необязательными:
$dateStart = Carbon\Carbon::create($request->annee, $request->mois, 1, 0, 0, 0);
$dateEnd = $dateStart->addDays(15)->subSecond(1);
DB::table('salaries')
->leftJoin('pointages', 'pointages.salarie_id', 'salaries.id')
->select(['salaries.nom', 'salaries.prenom', 'salaries.id'])
->selectRaw('SUM(pointages.sold) AS sold')
->selectRaw('SUM(pointages.payer) AS payer')
->whereBetween('pointages.datep', [$dateStart, $dateEnd])
->where(function($q) use($request) {
if ($request->has('salarie_id')) {
$q->orWhere('pointages.salarie_id', $request->salarie_id);
}
if ($request->has('chantier_id')) {
$q->orWhere('pointages.chantier_id', $request->chantier_id);
}
})
->groupBy('pointages.salarie_id')
->get();