Laravel w modelu nie działa to zapytanie, a w zwykłym sql działa

0

Mam taki problem mam skonstruowane zapytanie i to zapytanie mi w zwykłym DB działa poprawnie natomiast w modelu już nie i w modelu zwyczalnie zwraca błąd sql, może ja czegoś nie dowidzę.

DB::select

$rekord = DB::select("SELECT ( DATE(IF(HOUR(usees.DATE) >= $start, usees.DATE,Date_add(usees.DATE, INTERVAL - 1 DAY) )) )  "
                . "AS dat, usees.id_users, SUM(usees.portion) AS portion,date FROM   usees  where id_products = '1' and date <= '$date'  and id_users = '$id_users' GROUP  BY dat ORDER  BY dat desc");

Model

       $list = $Use->selectRaw("DATE(IF(HOUR(usees.date) >= '$start' usees.DATE,Date_add(usees.date, INTERVAL - 1 DAY))) as DAT" )
                   ->selectRaw("SUM(usees.portion) AS portion")
                   ->wherein("usees.id_products",$arrayId)
                   ->where("usees.date","<=",$date)
                   ->where("usees.id_users",Auth::User()->id)
                   ->groupBy("DAT")
                   ->orderBy("DAT","DESC")->get();

Zwraca mi taki błąd

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'usees.DATE,Date_add(usees.date, INTERVAL - 1 DAY))) as DAT, SUM(usees.portion) A' at line 1 (SQL: select DATE(IF(HOUR(usees.date) >= '5' usees.DATE,Date_add(usees.date, INTERVAL - 1 DAY))) as DAT, SUM(usees.portion) AS portion from `usees` where `usees`.`id_products` in (1, 3, 11, 16, 17, 18) and `usees`.`date` <= 2019-01-30 20:50:17 and `usees`.`id_users` = 1 group by `DAT` order by `DAT` desc)
2

Sporo dzieje się w tym zapytaniu - spróbuj podejść do naprawy na zasadzie dziel i zwyciężaj, tzn.: usuń połowę zapytania (np. od ->where("usees.date","<=",$date) do ->orderBy()) i zobacz czy nadal rzuca błędem; jeśli tak, no to znowu usuń połowę itd.

4

Przecinka Ci brakuje.

HOUR(usees.date) >= '$start' usees.DATE # pomiędzy start a usees - cokolwiek to jest 
  1. Nasze oczy często nas oszukują. Widzimy coś, czego nie ma tylko dlatego, że nastawiamy się na widzenie tego. Dlatego w takiej sytuacji dobrze jest użyć jakiegoś narzędzia: https://www.diffchecker.com/diff
    Wrzucasz jedno zapytanie i drugie i voila. Każde zapytanie budowanie w Laravelu możesz zobaczyć w postaci tekstu. Pewnie jest jakaś metoda w stylu toSql(), albo toString. Dobrze też jest sformatować te zapytania tak, zeby jak najwięcej było w nowej linii (w miarę możliwości). Wtedy diff będzie lepszy.
  2. W błędzie masz napisane:
MariaDB server version for the right syntax to use near 'usees.DATE,Date_add...`

Jak użyć tej informacji? Szukasz w zapytaniu "'usees.DATE,Date_add" i patrzysz co jest PRZED tym i czego PRZED tym może brakować.

0

@Desu: co więcej jest taka fajna paczka napisana przez mojego znajomego https://github.com/mnabialek/laravel-sql-logger

1 użytkowników online, w tym zalogowanych: 0, gości: 1