2015-12-04 32 views
5

W CakePHP 2, gdy piszesz coś takiego:CakePHP 3 QueryBuilder: warunek dla kilku wartości nie generuje „w” oświadczenie

$Model->find('all', ['conditions' => ['field' => 1]]); 

Dostaniesz kwerendę, która wygląda tak:

SELECT * FROM model WHERE model.field = 1; 

Albo kiedy piszesz coś takiego:

$Model->find('all', ['conditions' => ['field' => [1,2,3,5]]]); 

dostaniesz zapytanie, które tak:

SELECT * FROM model WHERE model.field IN (1,2,3,5); 

Co mam na myśli, to że instrukcja "IN" jest generowana automatycznie w zależności od rodzaju argumentu.

Z drugiej strony w CakePHP 3, gdy piszesz

$Table->find()->where(['field' => [1,2,3]])->all(); 

otrzymasz błąd, na przykład

Nie można przekonwertować wartości do liczby całkowitej

ponieważ generuje komunikatu takiego:

SELECT * FROM table WHERE table.field = Array(); 

Jest to błąd lub funkcja?

Odpowiedz

1

According to the official docs trzeba wskazać typ danych kolumny w CakePHP 3: -

$Table->find()->where(['field' => [1,2,3], ['field' => 'integer[]']])->all(); 

integer[] mówi ciasto oczekiwać tablicę liczb całkowitych.

Alternatywnie można dołączyć IN w stanie: -

$Table->find()->where(['field IN' => [1,2,3]])->all(); 

Oba przypadki rzuci dane do tablicy, jeśli nie jest już tak, że IN będzie działać zgodnie z oczekiwaniami, jeśli tylko wartość całkowita podjęcia.

+0

Dzięki. Zastanawiam się tylko, dlaczego nie działa już w poprzedniej, prostszej formie. Czy chodzi o wydajność? – sikor

+1

Sposób, w jaki działa w CakePHP 2, jest prawdopodobnie trochę niejednoznaczny i otwarty na nadużycia. Na przykład nie sprawdzono, czy warunek "IN" faktycznie był zamierzony, więc jeśli tablica została omyłkowo pominięta, wygenerowałaby poprawne zapytanie przy użyciu warunku "IN". Ta zmiana w CakePHP 3 może wydawać się niewygodna, ale wydaje mi się, że jest to lepsze podejście, ponieważ powinieneś wiedzieć, jakie powinny być twoje zamierzone warunki. – drmonkeyninja

+2

Po prostu chciałem dodać, że od wersji 3.1.2 (najlepiej jak potrafię powiedzieć), gdy zapomnisz "IN", ale podasz argument tablicowy, otrzymasz komunikat "Nie można przekonwertować wartości na ciąg" zamiast ogólnego wyjątek. W większości mówię tak, że gdy otrzymam ten błąd ponownie później i nie pamiętam, co to znaczy, ta strona pojawi się w wynikach Google. :-) Mam nadzieję, że pomaga to innym w tej samej sytuacji! –