2014-09-30 13 views
13

Jestem nowy w Laravel i Eloquent, przepraszam, jeśli to jest całkowicie głupie pytanie. Od pewnego czasu sprawdzałem, jak utworzyć model zarówno w dokumentacji here, jak i w kolejnym samouczku here (w sekcji Tworzenie modeli przy użyciu wymownej sekcji ORM) i zauważyłem, że rzeczywiste pola tabeli nigdy nie są wymienione, chyba że istnieje coś specyficznego na ich temat (np. posiadanie relacji z inną tabelą lub niewymaganie masowego przypisania, lub jeśli muszą być ukryte przed wyjściem JSON itp.)Pola w wymownych modelach Laravel

Czy te pola zostały pominięte celowo, a PHP po prostu je dodaje, gdy wykonuje kwerendę za pomocą PDO z włączoną FETCH_OBJ? Jeśli tak, dlaczego nie umieszczamy bezpośrednio pól w modelu? Czy nie pomaga nam wiedzieć, jakie mamy pola, a także IDE, takie jak PHPStorm, aby wyświetlić odpowiednie pola autouzupełniania?

Jeśli są one rzeczywiście wymagane, jaki poziom dostępu powinien mieć?

Dzięki.

Odpowiedz

16

Nazwy kolumn (pola) nie są wymagane w modelach wymownych. Jak zauważyłeś, konieczne jest tylko zdefiniowanie funkcji, które określają relacje, jakie model ma z innymi.

Nie jest konieczne uwzględnianie ich z powodu, o którym wspomniałeś (Laravel robi select *, a następnie dodaje wszystkie zwrócone wiersze do obiektu modelu jako właściwości publiczne). Jest to proces o nazwie nawodnienie i można zobaczyć dokładnie, co się dzieje, kopiąc w źródle Laravel. Oto podsumowanie tego, co się dzieje:

  1. nazywasz (na przykład), Users::find(123);
  2. Illuminate\Database\Eloquent\Model::find() rozmowy Illuminate\Database\Eloquent\Builder::find()
  3. find() konstruuje zapytanie SELECT * FROM users WHERE id = 123 a następnie zwraca wynik pierwszy wywołując Illuminate\Database\Eloquent\Builder::first()
  4. first() dodaje LIMIT 1 wywołując Illuminate\Database\Query\Builder::take()
  5. Następnie first() ustawia kolumny na r domyślnie (*), dzwoniąc pod numer Illuminate\Database\Eloquent\Builder::get().
  6. get() zwraca Illuminate\Database\Eloquent\Collection przy użyciu wartości zwracanej Illuminate\Database\Eloquent\Builder::getModels()
  7. getModels() faktycznie wykonuje kwerendę, a następnie wywołuje Illuminate\Database\Eloquent\Model::newFromBuilder() dla każdego wiersza zwracana
  8. newFromBuilder() tworzy nową instancję modelu i ustawia kolumny (pola), wywołując Illuminate\Database\Eloquent\Model::setRawAttributes()

Pominąłem niektóre niezwiązane ze sobą rzeczy, takie jak upragnione ładowanie, aby uprościć proces, ale tak właśnie się dzieje w przypadku każdego zapytania.

Dobrze trafiłeś, że znajomość pól wcześniej może być pomocna przy autouzupełnianiu. Ze względu na naturę setRawAttributes() jest całkowicie OK, aby zadeklarować wszystkie nazwy kolumn (pola) w modelu (wystarczy się upewnić, że są one publiczne). Konwencja, choć (i dla ciebie rozsądek), polega na ich pominięciu. Takie oświadczenia należy pozostawić migration files.

Po dokładniejszym sprawdzeniu źródła, jest , a nie ok, aby zadeklarować wcześniej pola. Dzieje się tak dlatego, że rzeczywiste wartości atrybutów są przechowywane we właściwości $attributes, a następnie dostępne za pomocą magicznej metody __get(). Problem polega na tym, że uprzednio definiując właściwości, uniemożliwisz wywołanie __get() podczas dostępu do pól. Dlatego nie jest to możliwe.

Istnieje jednak ways to hint to editors (like PhpStorm) about the existence of properties without explicitly defining them.

+1

Dziękujemy za szczegółową odpowiedź. Szkoda, że ​​nie mogę użyć go w ten sam sposób do PDO 'fetchObject()' gdzie mogę określić nazwę klasy i to nawodża instancję mojej konkretnej klasy. W rzeczywistości używam PhpStorm i wydaje mi się, że podpowiedzi używające tagów phpdoc działają, więc jest to dobre obejście dla właściwej obsługi IDE. – jbx

+0

Jeśli naprawdę chcesz tej funkcjonalności, możesz podklasować klasę 'Eloquent', która jest właściwie' Illuminate \ Database \ Eloquent \ Model', (spójrz w 'app/config/app.php' na tablicę aliasów i upewnij się, że ustaw alias 'Eloquent' na właściwy FQN dla twojej podrzędnej Eloquent) i zdefiniuj 'setRawAttributes()', aby zachowywał się w ten sposób, ale byłoby to prawdopodobnie bardziej skomplikowane niż użycie tagów phpdoc. –

+1

Tak, stanie się to zbyt skomplikowane i wykracza poza zakres tego, co próbuję osiągnąć. Chcę tylko mieć rzeczy czyste i możliwe do utrzymania. Odejście zbyt odbiegające od standardowego sposobu może również doprowadzić mnie do sytuacji, w której nie będę w stanie wyszukiwać rozwiązań ani zadawać pytań tutaj. Znaczniki phpdoc wyglądają dobrze, są również przydatne do wskazania, jakie magiczne pola ma model, jeśli otwierają go przez mniej inteligentny edytor, na przykład Notepad ++ lub Vi. Dzięki za twój wgląd! – jbx

Powiązane problemy