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?
Dzięki. Zastanawiam się tylko, dlaczego nie działa już w poprzedniej, prostszej formie. Czy chodzi o wydajność? – sikor
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
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! –