CakePHP 3 Virtual Properties
Oprócz dostępu do pól istniejących w bazie danych model może tworzyć wirtualne pola dla spójnego formatowania danych. Wirtualne właściwości definiujemy w pliku Entity. Tak więc dla tabeli użytkowników dodajemy funkcję do pliku src/Model/Entity/User.php. Nazwa funkcji to _getFullName. W funkcji złączamy dwa pola z bazy danych: first_name i last_name. Po dodaniu wirtualne pole może być używane w dowolnym miejscu aplikacji, w której dostępny jest model użytkownika.
namespace App\Model\Entity; use Cake\ORM\Entity; class User extends Entity { protected function _getFullName() { return $this->_properties['first_name'] . ' ' . $this->_properties['last_name']; } }Możemy potem uzyskać dostęp do wirtualnego pola np. w pliku index.ctp w następujący sposób.
echo $user->full_name;Przydatną i powszechnie używaną funkcją jest obliczenie wieku na podstawie daty urodzenia. Nie ma powodu, aby przechowywać oba w bazie danych, gdy wiek można łatwo obliczyć. W pliku src/Model/Entity/User.php dodaj następującą funkcję.
protected function _getAge() { return is_null($this->_properties['birthdate'])?null:$this->_properties['birthdate']->diff(Time::now())->format('%y'); }Teraz w łatwy sposób mamy dostęp do wieku za pomocą $user->age.
Oprócz łączenia istniejących pól, wirtualne właściwości mogą być używane do obliczania wartości lub wykonywania zaawansowanych zapytań na twoich danych. Poniższy przykład służy do obliczania sumy wartości mniejszej od pewnej daty. Najpierw dodaj use Cake\ORM\TableRegistry;. do pliku Entity, aby można było utworzyć zapytanie do bazy. Następnie zbuduj zapytanie w swojej funkcji:
// total_sq_miles virtual field protected function _getTotalSqMiles() { $annexations = TableRegistry::get('Annexations'); $query = $annexations->find(); $sum = $query->func()->sum('sq_miles'); $results = $query->select(['total' => $sum]) ->where([ 'effective_date <=' => $this->_properties['effective_date'], ]) ->first(); return $results->total; }