2016-10-09 55 views
7

Pracowałem nad urządzeniem Slim 2 i niedawno zacząłem wdrażać go na serwerze produkcyjnym. Wydaje się, że wszystko działa dobrze. Mogę się zalogować, więc wiem, że łączę się z bazą danych. Rozpoznano, kim jestem zalogowany, ponieważ rozpoznałem uprawnienia, które mam jako tego użytkownika. Mam inny stół z kilkoma wpisami. Kiedy robię ...Może pobierać kolekcję, ale nie filtrować danych w wersji produkcyjnej aplikacji Slim przy użyciu Eloquent

$collection = collect($app->item->where('user_id', $userId)->get()); 

a potem ...

print_r($collection); 

na serwerze produkcyjnym, widzę całą kolekcję tak jak ja na serwerze rozwoju, ale kiedy dodać .. .

$pack = $collection->where('status', 1); 

i zamiast drukować kolekcję, spróbuj wydrukować pakiet jak ...

print_r($pack); 

tę wiadomość wraca ...

Illuminate\Support\Collection Object ([items:protected] => Array ()) 

gdzie od wersji rozwojowej uzyskać przefiltrowaną kolekcję jak bym się spodziewał. Jak mogę zmienić kod, aby działał zarówno w środowisku programistycznym, jak i produkcyjnym?

+0

Czy to możliwe, że nie masz żadnych pozycji w kolekcji, gdzie status jest 1 w produkcji, ale masz niektóre ze statusem 1 w rozwoju? – quickshiftin

+0

Czy próbowałeś połączyć funkcję gdzie? Np .: $ app-> item-> where ('user_id', $ userId) -> where ('status', 1) -> get(); I upewnij się, że baza danych ma kilka wierszy ze statusem = 1. – JTheDev

+0

Zweryfikowałem, że istnieją elementy o statusie 1 w db produkcyjnym oraz w kolekcji, która wraca. Próbowałem z powodzeniem powiązać miejsce ("status", 1) podczas tworzenia kolekcji, która działa, ale muszę również odfiltrować w dół, gdzie status = 1 i gdzie status = 0, a ja nie chcę uderzyć w bazę danych więcej niż to konieczne. – user2530671

Odpowiedz

6

Najprawdopodobniej nie masz rekordy w bazie danych produkcyjnych z statusu z 1 i masz rekordy ze statusu 1 w rozwoju.

Sprawdź bazę danych bezpośrednio w produkcji, aby zweryfikować.

2

Najwyraźniej kolekcja zawiera tylko ciągi znaków lub pasuje tylko do łańcucha ... to działa!

$pack = $collection->where('status', '1'); 
+0

Cieszę się, że znalazłeś rozwiązanie, przegłosuj ode mnie. Podejrzewam, że Slim używa '===' wewnętrznie do porównywania drugiego argumentu z wynikami z bazy danych zamiast '=='. Można się tego dowiedzieć, patrząc na kod ... Wielką tajemnicą jest jednak to, jak twój kod działa w dev, ale nie jest produkowany bez uczynienia drugiego argumentu ciągiem. – quickshiftin

+0

@quickshiftin Powyżej zasugerowałeś sprawdzenie struktury bazy danych. Jedyną różnicą, jaką mogłem znaleźć było to, że lokalna wersja używała InnoDB, podczas gdy pilot korzystał z MyISAM. Nie jestem pewien, czy to było źródło problemu, ale zmieniłem dev, aby dopasować produkcję. – user2530671

+0

Mówiłem o wartościach rekordów, a nie strukturze (schemacie) DB. Zakładając, że schemat będzie taki sam. Zasadniczo, gdy ten sam kod działa w dev, ale nie działa, wystarczy wyeliminować różnice, aby określić, gdzie leży problem. Wciąż jednak nie dostałem odpowiedzi na to pytanie. Dlaczego uzyskujesz różne wyniki w obu środowiskach bez zmiany kodu? – quickshiftin

2

Sprawdź swoją Eumquent wersję. Przed kolekcjami w wersji 5.3 używano ścisłego porównania przy korzystaniu z where(), a do luźnego używa się whereLoose(), ale od 5.3 where() jest luźnym porównaniem, a whereStrict() jest ścisłym wywołaniem metody.

+1

Najlepsza odpowiedź tutaj – quickshiftin