2016-08-20 12 views
9

Ten błąd pojawił się po przeniesieniu całego źródła do wersji 5.3, a ja drapie się po głowie przez ponad dwie godziny teraz.Laravel 5.3: Błąd składniowy lub naruszenie dostępu: 1463 Niezgrupowujące pole "odległość" jest używane w klauzuli HAVING

Więc mam tego rodzaju zapytania wymowny:

POI::select('*', DB::raw("SQRT(POW((x - {$this->x}),2) + POW((y - {$this->y}),2)) AS distance")) 
     ->where('status', Config::get('app.poi_state.enabled')) 
     ->whereNotIn('id', $excludePOIList) 
     ->having('distance', '<=', $distance) 
     ->orderBy('distance')->get(); 

Udało się znaleźć przed uaktualnieniem teraz rzuca:

Syntax error lub dostępu naruszenie: 1463 dla grupowania pole „odległość” jest używane w klauzuli HAVING (SQL: select *, SQRT (POW ((x - 860.0000), 2) + POW ((y - 105.0000), 2)) Odległość AS od = 1 i id nie w (1) posiadanie distance < = 6 zamówienia według distance ASC)

Chciałem sprawdzić, czy tryb ONLY_FULL_GROUP_BY jest włączona na moim serwerze, ale to nie jest ...

SELECT @@ sql_mode NO_ENGINE_SUBSTITUTION

to samo zapytanie działa dobrze w środowisku roboczym MySQL. Co się dzieje?

Odpowiedz

30

Sprawdź w config/database.php plik z łączem mysql że ścisły jest fałszywe:

'strict' => false, 

Jeśli to prawda, umieścić w fałszywy.

+3

To było to, najwyraźniej tryb ścisły jest domyślnie włączony w L 5.3 – user3343366

+0

Dzięki, ale jakiekolwiek wyjaśnienie na temat tego, co robi ta "ścisła" opcja i jakie ma skutki uboczne? –

+0

Tryb ścisły kontroluje sposób, w jaki MySQL obsługuje nieprawidłowe lub brakujące wartości w instrukcjach zmiany danych, takich jak INSERT lub UPDATE. Wartość może być nieważna z kilku powodów. Na przykład może mieć nieprawidłowy typ danych dla kolumny lub może być poza zakresem. Brak wartości, gdy nowy wiersz do wstawienia nie zawiera wartości dla kolumny, która nie ma wartości NULL i nie zawiera wyraźnej klauzuli DEFAULT w swojej definicji. (W przypadku kolumny NULL wartość NULL jest wstawiana, jeśli brakuje wartości). Tryb ścisły wpływa również na instrukcje DDL, takie jak CREATE TABLE. https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-strict – Chintan7027

0

Spróbuj użyć klauzuli group by na polu odległości.

POI::select('*', DB::raw("SQRT(POW((x - {$this->x}),2) + POW((y - {$this->y}),2)) AS distance")) 
    ->where('status', Config::get('app.poi_state.enabled')) 
    ->whereNotIn('id', $excludePOIList) 
    ->groupBy('distance') 
    ->having('distance', '<=', $distance) 
    ->orderBy('distance')->get(); 
0

Nie wiem, dlaczego ten błąd wystąpił po aktualizacji, ale nie wcześniej. Jednak można przesunąć na odległość do warunku WHERE:

->where(DB::raw("SQRT(POW((x - {$this->x}),2) + POW((y - {$this->y}),2)) "), '<=', $distance)