You are on page 1of 75
Model Phalcon Leave a reply Like Share Sebuah model menggambarkan informasi (data) dari aplikasi dan aturan untuk memanipulasi data tersebut. Model Phalcon terutama digunakan untuk mengelola aturan interaksi dengan tabel database yang sesuai. Dalam kebanyakan kasus, setiap tabel dalam database Anda akan sesuai dengan satu model dalam aplikasi Anda. Sebagian besar logika bisnis aplikasi Anda akan terkonsentrasi dalam model. Phalcon \ MVC \ Model adalah dasar untuk semua model dalam aplikasi Phalcon. ini memberikan kemerdekaan basis data, fungsi CRUD dasar, kemampuan pencarian canggih, dan kemampuan untuk berhubungan/relasi dengan model satu sama lain, antara service lainnya. Phalcon \ MVC \ Model mengurangi penggunaan pernyataan SQL karena menerjemahkan metode dinamis ke masing-masing operasi mesin database. Model dimaksudkan untuk bekerja pada abstraksi database pada lapisan atas. Jika Anda perlu untuk bekerja dengan database pada tingkat yang lebih rendah memeriksa dokumentasi Komponen Phalcon \ Db Membuat Model Phalcon 7 Sebuah model adalah class yang extend dari Phalcon \ MVC \ Model . Dan harus ditempatkan di direktori model. Sebuah file model harus berisi satu class; nama class harus dalam notasi camel case : e1| setSource("the_robots") a9 } 10 ai] } Perintah initialize() ini hanya dipanggil sekali selama request, itu dimaksudkan untuk melakukan inisialisasi yang berlaku untuk semua instance dari model yang dibuat dalam aplikasi. Jika Anda ingin menyisipkan kode setiap instance dibuat, Anda dapat menggunakan ‘onConstruct’ id; 14 } 15 16 public function setName($name) 17 18 //The name is too short? 19 if (strlen($name) < 1@) { 20 ‘throw new \InvalidArgumentException( 21 22 $this->name = $name; 23 24. 25 public function getName() 26 { 27 return $this->name; 28 29 30 public function setPrice($price) 31 { 32 //Negative prices aren't allowed 33 if ($price < @) { 34, throw new \InvalidArgumentException(’ 35 } 36 $this->price = $price; 37 38 39 public function getPrice() 40 41 //Convert the value to double before be u 42 return (double) $this->price; 43 } 4a} } af i , Properti publik tidak memberikan kompleksitas dalam pengembangan. Namun getter / setter banyak meningkatkan testability, extensibility dan pemeliharaan aplikasi. Pengembang dapat memutuskan strategi mana yang lebih tepat untuk aplikasi yang mereka ciptakan. ORM kompatibel dengan kedua skema properti Model dalam Namespace 4 Namespace dapat digunakan untuk menghindari tabrakan nama class. Tabel dipetakan diambil dari nama class, dalam hal ini ‘Robots’ 1] select * from robots; | Robotina | mechanical | 1972 | Astro Boy | mechanical | 1952 | Terminator | cyborg | 2029 | + + + e9] 3 rows in set (@.0@ sec) Anda bisa menemukan record tertentu dengan primary key dan kemudian mencetak namanya e1] name; Setelah record ini dalam memori, Anda dapat membuat modifikasi data dan kemudian simpan perubahan e1] name = @5 | $robot->save() Seperti yang Anda lihat, tidak ada kebutuhan untuk menggunakan pemnyataan SQL mentah. Phalcon \ MVC \ Model menyediakan abstraksi database yang tinggi untuk aplikasi web. Menemukan Record 4 Phalcon \ MVC \ Model juga menawarkan beberapa metode untuk query record. Contoh berikut akan menunjukkan kepada Anda bagaimana untuk melakukan query untuk mendapatkan satu atau beberapa record dari model: e1| "name" as} )); 16] foreach ($robots as $robot) { 17 echo $robot->name, "\n"5 18] } 19 20] // Get first 10@ virtual robots ordered by name 21] $robots = Robots: :find(array( 22 “type = 'virtual'", 23 "order" => "name", 24 "Limit" => 100 25] ))5 26} foreach ($robots as $robot) { 27 echo $robot->name, "\n"; 28] } Anda juga bisa menggunakan perintah FindFirst () untuk mendapatkan hanya record pertama yang cocok dengan kriteria yang diberikan e1] name, "\ 6 7] // What's the first mechanical robot in robots tal 8] $robot = Robots::findFirst("type = ‘mechanical'" @9] echo “The first mechanical robot name is 10 11] // Get first virtual robot ordered by name 12] $robot = Robots::findFirst(array("type = ‘virtual 13] echo "The first virtual robot name is ", $robot->! $robo" a i , Baik perintah Find() atau FindFirst() menerima array asosiatif untuk menentukan kriteria pencarian: e1| "name DESC" 6 "Limit" => 30 e7) ))5 @8 a9] $robots = Robots: :find(array( 10 “conditions” => “type = ?1", che “bind” array(1 => “virtual” 12] ))5 Opsi query yang tersedia adalah: PARAMETER DESKRIPS! conto conditions Pencarian kondisi untuk operasi find. Digunakan untuk _ “conditions” => "Nama LIKE, ‘mengekstrak hanya catatan-catatan yang memenuhi ‘steve%” kriteria tertentu, Secara default Phalcon \ MVC \Model mengasumsikan parameter pertama adalah kondisi. columns Kembali kolom tertentu, bukan kolom penuh dalam ‘model. Bila menggunakan opsi ini obyek yang dikembalikan tidak lengkap bind Bind digunakan bersama-sama dengan opsi lainnya, ‘bind => array (“status" =>" dengan mengganti placeholder dan escape “type” => “beberapa waktu’) value sehingga meningkatkan keamanan bindTypes __ Ketika bind parameter, Anda dapat menggunakan Bind Types” => array (Column parameter ini untuk menentukan tambahan pengecekan _BIND_TYPE_STR, Kolom tipe data (casting) untuk parameter terikat meningkat BIND_TYPE_INT) keamanan order Digunakan untuk mengurutkan ResultSet. Gunakan satu "Order" => “nama DESC, statu: atau lebih kolom dipisahkan dengan koma, limit Batasi hasil query untuk hasil ke kisaran tertentu group Memungkinkan untuk mengumpulkan data di beberapa record dan kelompok hasil menurut satu atau lebih kolom for_update Dengan ops! ini, Phalcon \MVC \ Model membaca data terbaru yang tersedia, pengaturan kunci eksklusif pada setiap baris yg dibaca shared_lock Dengan ops! ini, Phalcon \MVC \ Model membaca data terbaru yang tersedia, pengaturan kunci bersama pada setiap baris dibaca Cache Cache resultset, mengurangi akses berkelanjutan ke sistem relasional hydration Mengatur strategi hidrasi untuk mewakili setiap record dikembalikan dalam hasil 410 / "limit => array (number => 10, “offset” => 6) “group” => “nama, status” “for_update” => true “shared_to cache’ array (‘ifetime” 3600, "key" => "my-find-key’) ‘nydration” =>Resullset: HYDRATE_OBJECTS. Jika Anda lebih suka, ada juga tersedia cara untuk membuat query dengan cara berorientasi obyek, daripada menggunakan sebuah array dari parameter: e1| where("type @s ->andWhere("year < 2000") a6 ->bind(array("type" => "mechanical")) @7 ->order ("name") 8 ->execute(); Perintah statis query() mengembalikan Phalcon \ MVC \ Model \ Criteria objek yang ramah dengan autocomplete IDE ‘Semua query secara intemal ditangani sebagai query PHQL. PHQL adalah tingkat tinggi, object-oriented dan bahasa yg mirip dgn SQL. Bahasa ini menyediakan lebih banyak fitur untuk melakukan query seperti join dengan model lain, mendefinisikan group, menambahkan agregasi dll Terakhir, ada perintah findFirstBy(). Perintah ini memperluas perintah “FindFirst ()” yang disebutkan sebelumnya. Hal ini memungkinkan Anda untuk dengan cepat melakukan pengambilan dari tabel dengan menggunakan nama properti dalam metode itu sendiri dan lewat itu parameter yang berisi data yang ingin Anda cari dalam kolom tersebut. Contohnya, untuk mengambil Model Robot seperti kami sebutkan sebelumnya: 1] flash->success("The first robot with tl 8] jelse{ 29 $this->flash->error("There were no robots foul 10 a i , Pethatikan bahwa kita menggunakan ‘Name’ dalam pemanggilan perintah dan memberikan variabel Sname untuk itu, yang berisi nama yang kita cari di tabel. Perhatikan juga bahwa ketika kita menemukan kecocokan dengan permintaan tsb, semua properti lain jd tersedia untuk jenis perintah ini Model resultsets 7 ‘Sementara findFirst () mengembalikan langsung sebuah instance dati class yg diambil (bila ada data yang akan dikembalikan), metode find() mengembalikan Phaleon \ MVC \ Model \ ResultSet \ Simple . Ini adalah obyek yang merangkum semua fungsi resultset telah seperti traversing, mencari baris tertentu, menghitung, dil Objek ini lebih baik daripada array standar. Salah satu fitur terbesar dari Phalcon \ MVC \ Model \ ResultSet adalah bahwa setiap saat hanya ada satu record dalam memori. Hal ini sangat membantu dalam manajemen memori terutama ketika bekerja dengan data dalam jumlah besar. e1 e2 3 a4 es 6 e7 es e9 18 1 12 13 14 15 16 7 18 19 28 21 22 23 24 25 26 27 28 29 38 31 32 33 34 35 36 37 38 39 40 41 name, "\n"; } // Traversing with a while $robots->rewind() 5 while ($robots->valid()) { $robot = $robots->current(); echo $robot->name, "\n"; $robots->next(); } // Count the resultset echo count($robots) ; // Alternative way to count the resultset echo $robots->count(); // Move the internal cursor to the third robot $robots->seek(2) ; $robot = $robots->current(); // Access a robot by its position in the resultse $robot = $robots[5]; // Check if there is a record in certain position if (isset($robots[3])) { $robot = $robots[3]; } // Get the first record in the resultset $robot = $robots->getFirst(); // Get the last record $robot = $robots->getLast(); i , Resultsets Phalcon merupakan emulator kursor yg dapat digeser, Anda bisa mendapatkan setiap baris hanya dengan mengakses posisinya, atau mencari pointer internal untuk posisi tertentu. Perhatikan bahwa beberapa sistem database tidak mendukung kursor macam ini, ini memaksa untuk kembali mengeksekusi-ulang query untuk memundurkan kursor ke awal dan mendapatkan baris pada posisi yang diminta. Demikian pula, jika resultset yang dilalui beberapa kali, query harus dijalankan jumlah yang sama kali Menyimpan hasil query besar dalam memori bisa mengkonsumsi banyak sumber daya, karena ini, resultsets diperoleh dari database dalam potongan terdiri dari 32 baris mengurangi kebutuhan untuk mengulang query. dalam beberapa kasus juga menghemat memori Perhatikan bahwa resultsets dapat diserialisasi dan disimpan di backend cache. Phalcon \ Cache dapat membantu dengan tugas itu. Namun, serialisasi data yang menyebabkan Phalcon \ MVC \ Model untuk mengambil semua data dari database berbentuk array, sehingga mengkonsumsi lebih banyak memori saat proses ini berlangsung @1| id; as| } EE es) u Filter resultsets ¥ Cara yang paling efisien untuk filter data menetapkan beberapa kriteria pencarian, database akan menggunakan indeks yang ditetapkan pada tabel untuk mengembalikan data yang lebih cepat. Sebagai tambahan Phalcon memungkinkan Anda untuk menyaring data menggunakan PHP dengan menggunakan semua sumber daya yang tidak tersedia dalam database: e1| filter(function($ 4 es //Return only customers with a valid e-mail 6 if (filter_var($customer->email, FILTER_VALID, @7 return $customer} 8 } @9 te} 3); “Robotina", "type" => "maid" //Perform the query $robots = Robots: :find(array( $conditions, "bind" => $parameters 5 // Query robots binding parameters with integer p $conditions = "name = ?1 AND type = ?2"5 $parameters = array(1 => "Robotina", 2 => "maid") $robots = Robots: :find(array( $conditions, “bind” => $parameters 5 // Query robots binding parameters with both stril $conditions = "name = :name: AND type = ?1"5 //Parameters whose keys are the same as placehold) $parameters = array( “Robotina", 33| ) 34 35] //Perform the query 36] $robots = Robots: :find(array( 37 $conditions, 38 "bind" => $parameters 391 ))5 fe , Bila menggunakan penampung numerik, Anda akan perlu untuk mendefinisikan mereka sebagai bilangan bulat yaitu 1 atau 2. Dalam hal ini “1” atau "2" dianggap string dan bukan angka, jadi placeholder tidak bisa berhasil diganti. String secara otomatis di-escape menggunakan PDO . Fungsi ini akan memastikan charset koneksi, jadi disarankan untuk menentukan charset benar dalam parameter koneksi atau konfigurasi database, karena charset yang salah akan menghasilkan efek yang tidak diinginkan saat menyimpan atau mengambil data. Selain itu Anda dapat mengatur parameter “bindTypes”, ini memungkinkan menentukan bagaimana parameter harus terikat menurut jenis datanya’ e1| "Robotina", e8 "year" => 2008 eo] ) 10 11] //Casting Types 12 irray( 23 > Column: :BIND_PARAM_STR, 14 "=> Column: :BIND_PARAM_INT 15 16 17] // Query robots binding parameters with string pl. 18] $robots = 11 find(array( 19 "name = :name: AND year = :yeai 20 “bind" => $parameters, 21 "pindTypes" => $types 221 ))3 Karena default bind-type \Phalcon\Db\Column:: BIND_PARAM_STR, tidak ada kebutuhan untuk menentukan ‘bindTypes” parameter jika semua kolom adalah dari tipe tersebut. Parameter Binding tersedia untuk semua metode query seperti find () dan FindFirst () dan juga metode perhitungan seperti count(), sum(), average() dil Inisialisasi / Mempersiapkan Record yg Diambil 4 Kadang setelah mendapat record dari database yang diperlukan untuk menginisialisasi data sebelum digunakan oleh seluruh aplikasi. Anda dapat menerapkan metode ‘afterFetch’ dalam model, event ini akan dilaksanakan setelah membuat instance dan menetapkan data untuk itu: @1] status = join(',', $this->status); 16 } 18 public function afterFetch() { 20 //Convert the string to an array 21 $this->status = explode(',', $this->statu: af t , Jika Anda menggunakan getter / setter dari / atau bersama-sama dengan properti public, Anda dapat menginisialisasi kolom setelah diakses e1| status); 4 } Relasi antar Model 4 Ada empat jenis relasi: satu-satu, satu-ke-banyak, banyak-ke-satu dan banyak-ke- banyak. Relasi mungkin searah atau dua arah, dan masing-masing dapat sederhana (satu untuk satu model) atau yang lebih kompleks (kombinasi model). Mode! manager mengelola foreign key constraint untuk hubungan ini, definisi ini membantu integritas referensial serta akses mudah dan cepat dari catatan terkait dengan model. Melalui penerapan relasi ini, mudah untuk mengakses data dalam model terkait dari setiap record dengan cara yang seragam Relasi Searah 4 Hubungan Searah adalah mereka yang dihasilkan dalam kaitannya dengan satu pada lainnya tetapi tidak sebaliknya Relasi dua arah { Hubungan dua arah membangun hubungan di kedua model dan setiap model mendefinisikan hubungan terbalik dari yang lain. Mendefinisikan Relasi 4 Dalam Phalcon, hubungan harus didefinisikan dalam perintah initialize() model. Metode belongsTo(), hasOne(), hasMany() dan hasManyToMany() mendefinisikan hubungan antara satu atau lebih kolom dari model satu untuk kolom dalam model lain. Masing-masing metode ini membutuhkan 3 parameter: kolom lokal, model yang direferensikan, kolom direferensikan. METODE DESKRIPS| hasMany Mendefinisikan hubungan 1-n hasOne Mendefinisikan hubungan 1-1 belongsTo Mendefinisikan hubungan n-1 hasManyToMany Mendefinisikan hubungan n-n Skema berikut menunjukkan 3 tabel yang hubungan akan memberi kita contoh mengenai relasi: ? @1] CREATE TABLE “robots” ( @2 “id* int(1@) unsigned NOT NULL AUTO_INCREMENT @3 >name* varchar(7@) NOT NULL, e4 “type” varchar(32) NOT NULL, 5 syear* int(11) NOT NULL, @6 PRIMARY KEY (*id™) e7] ); e8 @9| CREATE TABLE “robots_parts* ( 10 *id* int(1@) unsigned NOT NULL AUTO_INCREMENT 1 *robots_id™ int(1@) NOT NULL, 12 ‘parts_id* int(1@) NOT NULL, 13 ~created_at™ DATE NOT NULL, 14 PRIMARY KEY (“id™), 15 KEY “robots_id* (“robots_id*), 16 KEY “parts_id” (“parts_id’) wv] )3 18 19 | CREATE TABLE “parts” ( 20 d° int(1@) unsigned NOT NULL AUTO_INCREMENT 21 “name” varchar(7@) NOT NULL, 22 PRIMARY KEY (~ id) 231 ); i AAO a Model “Robot” memiliki banyak “RobotsParts”. Model “Parts” memiliki banyak “RobotsParts”’. Model “RobotsParts” milik kedua “Robot” dan “Parts” model sebagai banyak-ke- satu hubungan. Model “Robot” memiliki hubungan many-to-many ke “Parts” melalui “RobotsParts” Periksa diagram EER untuk memahami lebih baik hubungan: “Pid INT(10) ‘name VARCHAR(70) © type VARCHAR(32) “year INT(11) a id INT(10) @ robots id INT(10) © parts_id INT(10) ae Crocs 7 "F INT(10) name VARCHAR(70) rey Model dan relasinya bisa diimplementasikan sebagai berikut: 1] hasMany("id", "RobotsParts", "robo 12 } 13 1a} } 1s 16 17) hasMany("id", "RobotsParts", "part 29 } 38 31] } 32 33 34] belongsTo("robots_id", "Robots 48 $this->belongsTo("parts_id", “Parts”, 49 } 50 sil } af i , Parameter pertama menunjukkan kolom model lokal yang digunakan dalam hubungan; kedua menunjukkan nama model referensi dan ketiga nama field dalam model direferensikan. Anda juga bisa menggunakan array untuk mendefinisikan beberapa kolom dalam relasi, Relasi banyak-ke-banyak membutuhkan 3 model dan menentukan atribut yang terlibat dalam hubungan: e1] hasManyToMany( 12 "id", 13 "RobotsParts", 14 “robots_id", “parts_id", 15 "Parts", 16 "id" 17 3 18 } 19 20] } Memberdayakan Relasi Ketika secara eksplisit mendefinisikan hubungan antara model, mudah untuk menemukan_ record terkait untuk record tertentu. e1] robotsParts as $robotPart) { 5 echo $robotPart->parts->name, "\n"; Phalcon menggunakan metode magic __ set /__get /__call untuk menyimpan atau mengambil data terkait dengan relasi Dengan mengakses atribut dengan nama yang sama dengan relasi akan mengambil semua record yang terkait . e@1| robotsParts; // all the re. «T mi, » Juga, Anda dapat menggunakan magic getter: e1| getRobotsParts(); // all tl @5 | $robotsParts = $robot->getRobotsParts(array(' limi Sa , Jika perintah memiliki awalan “get” Phalcon \ MVC \ Model akan mengembalikan findFirst() / find() hasil. Contoh berikut membandingkan mengambil hasil pencarian yang berkaitan dengan menggunakan metode magic dan tanpa: e1| robotsParts; e8 e9| // Only parts that match conditions 1@] $robotsParts = $robot->getRobotsParts("created_at 11 12] // Or using bound parameters 13] $robotsParts = $robot->getRobotsParts(array( 14 "created_at = : " 15 "bind" => array("date" => "2@12-03-15" 16] ))3 7 18] $robotPart = RobotsParts: :findFirst(1) 19 2@| // RobotsParts model has a n-1 (belongsTo) 21| // relationship to RobotsParts then 22] $robot = $robotPart->robots; a i , Mendapatkan record terkait secara manual: e1| id . "' AND created 12] ) 13 14] $robotPart = RobotsParts: :FindFirst(1) 1s 16} // RobotsParts model has a n-1 (belongsTo) 17 // relationship to RobotsParts then 18] $robot = Robots::findFirst("id = '" . $robotPart- «f i , Awalan “get” digunakan untuk find() / findFirst() record terkait. Tergantung pada jenis hubungan itu akan menggunakan ‘find’ atau ‘FindFirst': JENIS DESKRIPS! METODE IMPLISIT Belongs- Pengembalian instance model record terkait langsung FindFirst T Has-One _ Pengembalian instance model record terkait langsung FindFirst Has-Many Pengembalian koleksi instance model model direferensikan find Has-Many- Pengembalian koleksi instance model yg direferensikan, secara implisittidak (Query yang to-Many —‘innerjoin’ dengan model yang teribat kompleks) Anda juga dapat menggunakan awalan “count” untuk mendapatkan integer yang menunjukkan hitungan record terkait: @1] countRobotsParts() _— la] , Relasi dgn Alias 7 Untuk menjelaskan lebih baik bagaimana alias bekerja, mari kita periksa contoh berikut Table “robots_similar” memiliki fungsi untuk mendefinisikan robot apa yang mirip dengan yg lain @1] mysql> desc robots_similar; int(10) unsigned robots_id | int(1@) unsigned | NO | MI similar_robots_id | int(1@) unsigned | No es | +-- -- ==> - e9| 3 rows in set (0.00 sec) Kedua ‘robots_id” dan “similar_robots_id” memiliki hubungan dengan model Robots: id INT(10) ‘© name VARGHAR(70) ‘type VARCHARI32) year INT(11) sos cI Pid INT robes id INT © siilar_robotsié INT Sebuah model yang memetakan tabel ini dan hubungan nya adalah sebagai berikut e1 e2 3 a4 es 6 e7 es 9 18 1 12 > belongsTo(‘robots_id', ‘Robots’, ' $this->belongsTo('similar_robots_id', ‘Rol } _D=— xe , Karena kedua hubungan mengarah ke model yang sama (Robot), memperoleh record yang berhubungan dengan hubungan tidak bisa jelas: e1 e2 @3 04 es 6 e7 8 e9 18 che getRobots() ; //but, how to get the related record based on the //if both relationships have the same name? Soa , Alias memungkinkan kita untuk mengubah nama relasi keduanya untuk memecahkan masalah ini: 1] belongsTo('similar_robots_id', ‘Rol 12 ‘alias’ => 'SimilarRobot 13 ys 14 } 15 as} } >belongsTo( ‘robots_id', ‘Robots’, alias' => ‘Robot’ af ti , Dengan alias kita bisa mendapatkan record yang terkait dengan mudah: ? e1| getRobot(); @7 | $robot = $robotsSimilar->robot; @8 e9] //Returns the related record based on the column 1@| $similarRobot = $robotsSimilar->getSimilarRobot( 11] $similarRobot = $robotsSimilar->similarRobot; a 7 , Magic Getters vs metode Explicit { Kebanyakan IDE dan editor dengan kemampuan auto-completion tidak dapat menyimpulkan jenis yang benar saat menggunakan getter magic, selain getter magic anda dapat mendefinisikan metode-metode tsb secara eksplisit dengan docblocks yg sesuai, membantu IDE untuk menghasilkan auto-completion yang lebih baik: e1| hasMany("id", "RobotsParts", "robo 23 } 14 15 i 16 * Return the related “robots parts" 17 * 18 * @return \RobotsParts[] 19 */ 2 public function getRobotsParts($parameters=nu. 21 { 22 return $this->getRelated('RobotsParts', $| 23 } 24 25] } al i , Virtual Foreign Keys 4 Secara default, relationship tidak bertindak seperti foreign keys basis data, yaitu, jika Anda mencoba untuk memasukkan / memperbarui nilai tanpa nilai yang valid dalam model yg direferensikan, Phalcon tidak akan menghasilkan pesan validasi, Anda dapat mengubah perilaku ini dengan menambahkan parameter keempat ketika mendefinisikan hubungan Model RobotsParts dapat diubah untuk mengaktifkan fitur ini: e1] belongsTo("robots_id", "Robots", " 15 "foreignkey" => true 16 d)3 7 18 $this->belongsTo("parts_id", "Parts", “id 19 "foreignKey" => array( 20 “message” => "The part_id does no 21 ) 22 Ys 24 25 | } af i , Jika Anda mengubah relasi belongsTo() untuk berfungsi sbg foreign key, maka akan memvalidasi setiap nilai-nilai masukkan / pembaruan di kolom tersebut, apakah nilai tsb valid pada model direferensikan. Demikian pula, jika hasMany() / hasOne() diubah maka akan memvalidasi bahwa record tsb tidak dapat dihapus jika record tsb masih digunakan pada model referensi e1| hasMany("id", “RobotsParts", “part @9 “foreignkey” => array( 18 "message" => "The part cannot be 12 Ys a 7 , Cascade / Membatasi Action 7 Relasi yang bertindak sebagai foreign key virtual secara default membatasi create / update / delete record untuk menjaga integritas data: 1] hasMany('id', 'Store\Models\Parts 18 “foreignkey' => array( 19 ‘action’ => Relation: :ACTION_CASC, 20 ) 21 dds 22 } 23 24] } a i , Kode di atas disusun untuk menghapus semua record yg direferensikan (parts) jika master record (robots) dihapus Melakukan Perhitungan 4 Perhitungan (atau agregasi) adalah alat bantu untuk fungsi-fungsi yang umum digunakan sistem database seperti COUNT, SUM, MAX, MIN atau AVG. Phalcon \ MVC \ Mode] memungkinkan untuk menggunakan fungsi-fungsi ini langsung dari metode yang disebutkan. Contoh Count: e1 e2 @3 04 es 6 e7 es e9 18 1 12 13 14 15 16 17 18 19 28 21 22 23 24 “area” foreach ($group as $row) { echo "There are ", $row->rowcount, } // Count employees grouping by their area and ord $group = Employees: :count(array( "group" => “area”, “order™ => “rowcount" 5 in", $ro1 // Avoid SQL injections using bound parameters 25 | $group = Employees: : count (array( 26 “type > 20", 27 "bind" => array($type) 281 )); (aaa) , Contoh Sum: e1] “salary 5 a6 | // How much are the salaries of all employees in 7] $total = Employees 8 "column" > @9 “conditions” => = ‘Sales'" 1e} )); 1 12] // Generate a grouping of the salaries of each ar 13] $group = Employees: :sum(array( 14 "column" "salary", 15 "group" "area" 16} ))3 17] foreach ($group as $row) { 18 echo "The sum of salaries of the ", $row->area 19} } 20 21| // Generate a grouping of the salaries of each ari 22| // salaries from higher to lower 23 | $group = Employees: : sum(array( 24 "column" "salary", 25, "group" "area", 26 "order" “sumatory DESC" 27) ))5 28 29 // Avoid SQL injections using bound parameters 30| $group = Employees: :sum(array( 31 "conditions" => "area > ?0", 32 "bind" => array($area) 331 ))5 _— a , Contoh Average: @1] es 6] // What is the average salary for the Sales's are: e7| $average = Employees: :average(array( @8 "column" => "salary", e9 "conditions" => "area = ie] ))3 11 12] // Avoid SQL injections using bound parameters 13 | $average = Employees: :average(array( 14 "column" => “age 15 "conditions" => “area > ?0", 16 “bind" => array($area) 171 ))5 a a contoh Max / Min : @1] "area = 'Sales'" te] ))5 11 12| // What is the lowest salary of all employees? 13 | $salary = Employees: :minimum(array("column” af i , Hydration Mode 4 Sebagaimana disebutkan di atas, resultsets adalah koleksi objek yang lengkap, ini berarti bahwa setiap hasil yg dikembalikan adalah obyek yang mewakili setiap baris dalam database. Objek ini dapat dimodifikasi dan disimpan lagi secara permanen: e1| year = 2000; 26 $robot->save() e7| } Kadang-kadang record diambil hanya untuk ditampilkan kepada pengguna dalam mode read-only, dalam kasus ini mungkin berguna untuk mengubah cara record ditampilkan untuk memfasilitasi penanganannya. Strategi yang digunakan untuk mewakili objek dikembalikan dalam resultset ini disebut ‘hydration mode’: e1| setHydrateMode(Resultset: :HYDRATE_ARRAYS @9 10] foreach ($robots as $robot) { 1 echo $robot[‘year'], PHP_EOL; 12| } 13 14] //Return every robot as an stdClass 15 | $robots->setHydrateMode(Resultset: :HYDRATE_OBJECT: 16 17] foreach ($robots as $robot) { 18 echo $robot->year, PHP_EOL; 19] } 20 21] //Return every robot as a Robots instance 22 | $robots->setHydrateMode(Resultset: :HYDRATE_RECORD' 23 24] foreach ($robots as $robot) { 25 echo $robot->year, PHP_EOL; 26] } ¢ i , Modus Hidrasi juga dapat dikirimkan sebagai parameter pada perintah ‘find’ ? e1] Resultset: :HYDRATE_ARRAYS e7]| ))5 e8 9] foreach ($robots as $robot) { 10 echo $robot[‘year'], PHP_EOL; 11} } Create/Updating Record 4 Perintah Phalcon\MVC\Model::save() memungkinkan Anda untuk melakukan create / update record menyesuaikan apakah sudah ada tidaknya di tabel yang terkait pada model. Perintah Save disebutkan intemal oleh perintah create dan updatePhalcon\MVC\Model . Untuk memastikan perintah ini bekerja seperti yang diharapkan maka perlu didefinisikan terlebih dahulu primary key entitas untuk menentukan apakah suatu record harus diperbarui atau ditambahkan Juga perintah tsb bisa mengeksekusi validator terkait, foreign key virtual dan event yang didefinisikan dalam model. e1| type = "mechanical"; @5 | $robot->name = “Astro Boy"; @6 | $robot->year = 1952; @7| if ($robot->save() == false) { @8 echo "Umh, We can't store robots right now: \! e9 foreach ($robot->getMessages() as $message) { 10 echo $message, "\n"5 1 } 12] } else { 13 echo “Great, a new robot was saved successful 4 a i , Sebuah Array dapat diberikan ke perintah “save” untuk menghindari penetapan setiap kolom secara manual. Phalcon \ MVC \ Model akan memeriksa apakah ada setter diterapkan untuk kolom yg diberikan dalam array memberikan prioritas daripada memberikan langsung nilai- nilai dari atribut: e1| save(array( es "type" => “mechanical”, 26 "name" => "Astro Boy", e7 "year" => 1952 esl )); Value yg diberikan secara langsung atau melalui array atribut telah dilakukan escape/ sanitaize sesuai dengan tipe data atribut terkait. Jadi, Anda dapat melewatkan sebuah array aman tanpa khawatir tentang kemungkinan suntikan SQL: @1] save($_POsT) ; Tanpa tindakan pencegahan penempatan nilai massal dapat memungkinkan penyerang untuk menetapkan nilai database kolom manapun. Gunakan fitur ini hanya jika Anda ingin mengizinkan user untuk create / update setiap kolom dalam model, bahkan jika kolom tersebut tidak ada dalam element form yg dikirim. Anda dapat mengatur parameter tambahan ‘save’ untuk menetapkan whitelist kolom yang diambil saja ketika melakukan menempatkan nilai secara massal: e1| save($ POST, array(‘name', ‘type'))5 Kepastian Create / Update 4 Kama suatu hal, bisa kita bisa menghendaki create record tetapi justru update. Hal ini bisa terjadi jika kita menggunakan Phalcon\MVC\Model::save() untuk menyimpan record dalam database. Jika kita ingin benar-benar yakin bahwa record merupakan create atau update, kita dapat mengubah perintah save() dengan create() atau update(): e1| type = “mechanical” @5| $robot->name = "Astro Boy"; @6 | $robot->year = 1952; @7 @8] //This record only must be created @9] if ($robot->create() == false) { 10 echo "Umh, We can't store robots right now: \ 11 foreach ($robot->getMessages() as $message) { 12 echo $message, "\n"; 13 } 14] } else { 15 echo "Great, a new robot was created successfi as} } Metode ini “create” dan “update” juga menerima sebuah array nilai sebagai parameter. Kolom Identitas Auto-generate 4 Beberapa model mungkin memilki kolom identitas. Kolom ini biasanya adalah primary key dari tabel. Phalcon \ MVC \ Model dapat mengenali kolom identitas yg muncul dalam SQL INSERT yg dihasilkan, sehingga sistem database dapat menghasilkan nilai auto generate untuk itu, Setelah membuat rekor, kolom identitas akan diisi dengan nilai yang dihasilkan dalam sistem database: e1] save(); 04 a5] echo "The generated id is: ", $robot->id Phalcon \ MVC \ Mode! mampu mengenali kolom identitas. Tergantung pada sistem database, kolom tersebut mungkin kolom serial seperti di PostgreSQL atau kolom auto_increment dalam kasus MySQL. PostgreSQL menggunakan urutan untuk menghasilkan nilai-nilai auto-numerik, secara default, Phalcon mencoba untuk mendapatkan nilai yang dihasilkan dari urutan “table_field_seq’, misalnya: robots_id_seg, jika urutan yang memiliki nama yang berbeda, metode “getSequenceName” perlu diterapkan e1| name = ‘Shinichi Osawa‘; $artist->country = ‘Japan’; // Create an album $album = new Albums(); $album->name = ‘The One’; $album->artist = $artist; //Assign the artist $album->year = 2008; //Save both records $album->save(); Menyimpan record serta record yg terkait dengannya pada relasi has-many: 1] name = ‘The One @9] $album->artist = $artist; 10 11] $songs = array(); 12 13| // Create a first song 14| $songs[@] = new Songs() 15 | $songs[@]->name = ‘Star Guitar’; 16] $songs[@]->duration = '5:54'; 17 18 | // Create a second song 19] $songs[1] = new Songs() 2@| $songs[1]->name = ‘Last Days’ 21] $songs[1]->duration = '4:29'; 22 23| // Assign the songs array 24] $album->songs = $songs; 25 26] // Save the album + its songs 27 | $album->save() «T Wm, —| , Menyimpan album dan artis pada saat yang sama secara implisit memanfaatkan transaksi sehingga jika ada yang tidak beres ketika menyimpan record terkait, induk data tidak akan disimpan pula. Pesan akan diteruskan kembali ke pengguna untuk informasi mengenai apapun kesalahan yg muncul. Catatan: Menambahkan entitas terkait dengan overloading metode berikut tidak dimungkinkan: + PhalconMvcModel : : beforesave() + PhaLconMvcModel : :beforeCreate() + PhalconMvcModel : :beforeUpdate() Anda perlu overload PhalconMvcModel :: save () agar hal ini bekerja dari dalam model Pesan validasi 7 Phalcon \ MVC \ Mode! memiliki subsistem pesan yang menyediakan cara yang fleksibel untuk membuat atau menyimpan pesan validasi yg dihasilkan selama proses insert / update. Setiap pesan terdiri dari sebuah instance dari kelas Phalcon \ MVC \ Model \ Message . Himpunan pesan yang dihasilkan dapat diambil dengan perintah getMessages(). Setiap pesan berisi informasi yg lebih lengkap seperti nama field yang menghasilkan pesan atau jenis pesan 1] save() == false) { ea. foreach ($robot->getMessages() as $message) { es echo "Message: ", $message->getMessage(); 6 echo "Field: ", $message->getField(); e7 echo "Type: ", $message->getType(); e8 eo} } a ii , Phalcon \ MVC \ Mode! dapat menghasilkan jenis pesan validasi berikut: JENIS DESKRIPSI PresenceOf Dihasilkan ketika kolom dengan atribut non-null pada database sedang mencoba untuk memasukkan / memperbarui nilai null ConstraintViolation _Dihasilkan ketika bagian kolom foreign key virtual mencoba untuk memasukkan / memperbarui nilai yang tidak ada dalam model yg direferensikan InvalidValue Dihasilkan ketika validator gagal karena nilai yang tidak valid InvalidCreateAttempt _Diproduksi ketika sebuah record dicoba untuk dibuat tapi sudah ada InvalidUpdateAttempt Diproduksi ketika sebuah record berusaha untuk diperbarui tapi itu tidak ada Metode getMessages() dapat di-overide dalam model untuk menggantikan / menerjemahkan pesan standar yang dihasilkan secara otomatis oleh ORM: e1| getType()) { 10 case ‘InvalidCreateAttempt': 1 $messages[] = ‘The record cani 12 break; 13 case ‘InvalidUpdateattempt': 14 $messages[] = ‘The record cani 15 break; 16 case ‘Presencedf 17 $messages[] = ‘The field 18 break; 19 } 20 } 24 return $messages; 22 } 23] } a i , Event dan Event Manajer 4 Model memungkinkan Anda untuk menerapkan event yg akan dimunculkan ketika melakukan insert / update / delete. Hal ini membantu mendefinisikan aturan bisnis untuk model tertentu. Berikut ini adalah event yang didukung oleh Phalcon \ MVC \ Model dan ketertiban mereka eksekusi: OPERAS! NAMA BISA PENJELASAN MENGHENTIKAN ‘OPERASI? Inserting/Updating _ beforeValidation Yes Dijalankan sebelum kolom divalidasi untuk non nulls / string kosong Inserting Updating Inserting /Updating onValidationFails Inserting Updating Inserting / Updating _afterValidation Inserting /UpdatingbeforeSave Updating beforeUpdate Inserting beforeCreate Updating AterUpdate Inserting afterCreate Inserting /Updating afterSave beforeValidationOnCreate beforeValidationOnUpdate afterValidationOnCreate afterValidationOnUpdate Yes YES Yes (sudah berhentiy YES Yes YES YES YES Yes No. No. No. atau foreign key Dijalankan sebelum kolom divalidasi untuk non nulls / string kosong atau foreign key ketika operasi penyisipan sedang dijalankan Dijalankan sebelum kolom divalidasi untuk non nulls / string kosong atau foreign key ketika operasi update sedang dijalankan Dijalankan setelah validator integritas gagal Dijalankan setelah kolom divalidasi untuk non nulls / string kosong atau foreign key ketika operasi penyisipan sedang dijalankan Dijalankan setelah kolom divalidasi untuk ‘non nulls / string kosong atau foreign key ketika operasi update sedang dijalankan Dijalankan setelah kolom divalidasi untuk non nulls / string Kosong atau foreign key Berjalan sebelum operasi pada sistem database Berjalan sebelum operasi pada sistem database hanya kelika sebuah operasi update sedang dibuat Berjalan sebelum operasi padasistem database hanya jika operasi memasukkan sedang dibuat Berjalan setelah operasi padasistem database hanya ketika sebuah operasi update sedang dibuat Berjalan setelah operasi pada sistem database hanya jika operasi memasukkan sedang dibuat Berjalan setelah operasi pada sistem database Implementasi Event di dalam Class Model 4 Cara termudah untuk membuat model bereaksi terhadap event adalah menerapkan metode dengan nama yang sama dari event di viass mode! created_at = date(‘Y-m-d H:i:s'); public function beforeUpdate() { //Set the modification date $this->modified_in = date('Y-m-d H:i:s'); } } i , Menggunakan Event Manajer Sendiri_ 4 Selain itu, komponen ini terintegrasi dengan Phalcon \ Events \ Manajer , ini berarti kita dapat membuat pendengar/listener yang berjalan saat sebuah event dipicu e1 e2 3 e4 es 6 e7 8 e9 18 1 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 attach( ‘model’, function(: if ($event->getType() == ‘beforeSave if ($robot->name == ‘Scooby Doo’ echo "Scooby Doo isn't a robo return false; } } return true; ns //Attach the events manager to the event $this->setEventsManager ($eventsManager) ; T , Dalam contoh di atas, EventsManager hanya bertindak sebagai jembatan antara obyek dan pendengar (fungsi anonim). Event akan disalurkan ke pendengar ketika ‘robot’ disimpan: e1 e2 3 e4 es 6 name = ‘Scooby Doo’ $robot->year = 1969; $robot ->save(); Jika kita ingin semua objek yang dibuat dalam aplikasi kita menggunakan EventsManager yang sama, maka kita perlu menetapkan ke Model Manager: e1 e2 @3 04 setShared('modelsManager’, function() { es 6 e7 es @9 18 1 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 $eventsManager = new \Phalcon\Events\Manager( //attach an anonymous function as a listener $eventsManager->attach(‘model', function($evel //Catch events produced by the Robots mod: if (get_class($model) == 'Robots') { if ($event->getType() == ‘beforeSave’ if ($model->name == ‘Scooby Doo’) echo "Scooby Doo isn't a robo return false; + return true; 5 //Setting a default EventsManager $modelsManager = new ModelsManager(); $mode1sManager->setEventsManager ($eventsManag) return $modelsManager; 3 i , Jika pendengar mengembalikan nilai false maka akan menghentikan operasi yang sedang dieksekusi saat ini. Menerapkan Aturan Bisnis 9 Ketika insert, update atau delete dijalankan, model memverifikasi apakah ada metode dengan nama peristiwa yang tercantum dalam tabel di atas Kami merekomendasikan bahwa metode validasi dideklarasikan protected untuk mencegah logika bisnis diakses secara publik. Contoh berikut mengimplementasikan suatu event yang memvalidasi tahun ini tidak bisa lebih kecil dari 0 saat update atau insert: e1 2 3 e4 es 6 e7 es year < @) { e9 echo "Year cannot be smaller than zer 10 return false; 1 } 12 } 13 14a] } «[ i , Beberapa event mengembalikan nilai false sebagai tanda untuk menghentikan operasi saat ini. Jika suatu event tidak mengembalikan apa-apa, Phalcon \ MVC \ Model akan mengasumsikan sebagai nilai true. Validasi Integritas data 7 Phalcon \ MVC \ Model menyediakan beberapa event untuk memvalidasi data dan mengimplementasikan aturan bisnis. Event special ‘validasi” memungkinkan kita untuk memanggil validator built-in pada record. Phalcon memberikan beberapa built-in validator yang dapat digunakan pada tahap validasi. Contoh berikut menunjukkan cara menggunakannya’ 1] validate(new InclusionIn( 13 array( 14 “field” => “type”, 15 "domain" => array("Mechanical", " 16 ) 17 5 18 19 $this->validate(new Uniqueness( 20 array( 21 "field" "name", 22 "message" => "The robot name must 23 ) 24 d)5 25 26 return $this->validationHasFailed() != tri 27 } 28 29 | } i Contoh di atas melakukan validasi dengan menggunakan built-in validator “InclusionIn". Fungsi tsb memeriksa kesesuaian nilai field “type” dalam daftar domain. Jika nilai tidak termasuk dalam metode maka validator akan gagal dan mengembalikan nilai false. Berikut built-in validator yang tersedia: NAMA PENJELASAN PresenceOf Memvalidasi bahwa nitai kolom yang non null atau string Email kosong, Validator ini akan ditambahkan secara otomatis berdasarkan atribut yg ditandai sebagai non null pada tabel terkait Memvalidasi bahwa kolom berisi format email yang valid Exclusionin Memvalidasi bahwa nilai tidak termasuk dalam daftar pengecualian Inclusionin Memvalidasi bahwa nilai termasuk dalam dafiarnilal yang mungkin Numericality Memvalidasi bahwa fleld memiliki format numerik Regex Memvalidasi bahwa nilai field sesuai dengan ekspresi reguler Uniqueness Memvalidasi bahwa sebuah kolom atau kombinasi kolom yang tidak ada lebih dari sekali dalam record pada tabel terkait StringLength | Memwvalidasi panjang string unl Selain validator built-in, Anda dapat membuat validator Anda sendiri e1 e2 @3 04 es 6 e7 eg eo 10 che 12 13 14 15 16 Memvalidas! bahwa nilai memiliki format URL yang valid getOption('field'); $min $max $this->getOption('min'); $this->getOption('max') 5 $value = $model->$field; CONTOH 17 18 if ($min <= $value && $value <= $max) { 19 $this->appendMessage( 20 The field doesn't have the right 21 $field, 22 "MaxMinValidator" 23 3 24 return false; 25 } 26 return true; 27 } 28 29} } « it , Menambahkan validator untuk model: e1| validate(new MaxMinValidator( eo array( 10 "field" => "price", 11 in” => 10, 12 > 108 13 ) 14 Ys 15, if ($this->validationHasFailed() == true 16 return false; 17 } 18 } 19 20} } é i , Ide menciptakan validator adalah membuatnya dapat digunakan kembali pada beberapa model. Sebuah validator juga dapat dibuat sederhana seperti berikut: e1| type == "Old") { 12 $message = new Message( 13 “sorry, old robots are not allowe: 14 "type", 15 “MyType” 16 3 17 $this->appendMessage( $message) ; 18 return false; 19 } 20 return true; 21 } 22 23] } a i , Menghindari Injeksi SQL 4 Setiap nilai yang diberikan untuk model atribut di-escape tergantung dari jenis datanya. Seorang pengembang tidak perlu untuk escape data secara manual pada setiap nilai sebelum menyimpannya ke database. Internal Phalcon menggunakan kelebihan bound parameter yang disediakan oleh PDO untuk secara otomatis escape setiap nilai yang akan disimpan dalam database. @1| mysql> desc products; @2 — @3 I ea] + - ea] | | int(1@) unsigned | NO | PR @6| | product_types_id | int(1@) unsigned | NO | MU 7 name varchar(7®) | NO | e8 price decimal (16,2) No e9] | active | char(1) | Yes | 10] +-- - 11| 5 rows in set (0.00 sec) a ed) Jika kita menggunakan hanya PDO untuk menyimpan record dengan cara yang aman, kita perlu menulis kode berikut: e1| prepare($sql); 10 11] $sth->bindParam(':productTypesId', $productTypesli 12 | $sth->bindParam(':name’, $name, PDO::PARAM_STR, 71 13 | $sth->bindparam(':price', doubleval($price)); 14] $sth->bindParam(':active', $active, PDO: :PARAM_STI 15 16 | $sth->rexecute(); ( , Kabar baiknya adalah bahwa Phalcon melakukan ini untuk Anda secara otomatis: 1] product_types_id @5] $product->name = ‘Artichoke’; 06] $product->price = 10.5; @7] $product->active = ‘Y'; 8 | $product->create(); Mengabaikan Kolom Tertentu 4 Untuk memberitahu Phalcon\MVC\Model untuk selalu mengabaikan beberapa kolom dalam create dan / atau update record untuk mendelegasikan/menyerahkan tugas ini ke sistem database untuk memberikan dari nilai kolom sendiri baik melaui trigger atau nilai default kolom tsb: 1] skipAttributes(array('year', ‘pric 10 a1 //Skips only when inserting 12 $this->skipAttributesOnCreate(array( ‘crea 13 14 //Skips only when updating 15 $this->skipAttributesOnUpdate(array (‘modi 16 } 17 1s] } SSRs ’ Kode ini akan mengabaikan kolom tsb secara global pada setiap operasi INSERT / UPDATE di seluruh aplikasi. Memaksakan nilai default (dr database) bisa dilakukan dengan cara sebagai berikut: e1| name = ‘Bender’; @5| $robot->year = 1999; 6 | $robot->created_at = new \Phalcon\Db\RawValue( ‘de: @7| $robot->create(); es i , Sebuah callback juga dapat digunakan untuk menyatakan kondisi kapan menggunakan nilai default (dr database) otomatis: 1] price > 10000) { 1 $this->type = new RawValue('default') 12 } 13 } 14] } ees > Jangan menggunakan \Phalcon\Db\RawValue untuk menetapkan nilai data eksternal (seperti input pengguna) atau data variabel. Nilai kolom ini akan diabaikan ketika binding parameter pada query. Jadi bisa digunakan untuk menyerang aplikasi, menyuntikkan SQL. Update Dinamis 4 Pemyataan UPDATE SQL yang secara default dibuat dengan setiap kolom yang didefinisikan dalam model (SQL full update semuakolom). Anda dapat mengubah model tertentu untuk melakukan update dinamis, dalam hal ini, hanya kolom yang telah berubah digunakan untuk membuat pernyataan SQL final Dalam beberapa kasus, cara ini dapat meningkatkan kinerja dengan mengurangi lalu lintas antara aplikasi dan database server, khususnya ketika tabel memiliki field blob / text: > e1| useDynamicUpdate(true) Menghapus Record 7 Metode Phalcon\MVC\Model::delete() memungkinkan untuk menghapus catatan. Anda dapat menggunakannya sebagai berikut e1| delete() == false) { 26 echo "Sorry, we can't delete the robot rij e7 foreach ($robot->getMessages() as $messag) @8 echo $message, "\n"; e9 10 } else { 11 echo “The robot was deleted successfully 12 13] } ( , Anda juga dapat menghapus banyak record dengan menelusuri resultset dengan foreach ? e1| delete() == false) { es echo “Sorry, we can't delete the robot rij @6 foreach ($robot->getMessages() as $messag) @7 echo $message, "\n"; 8 } e9 } else { 10 echo “The robot was deleted successfully a. } 22] + « al , Event berikut ini tersedia untuk mendefinisikan aturan bisnis kustom/sendiri yang dapat dieksekusi ketika operasi delete dilakukan: ‘OPERAS! NAMA BISA MENGHENTIKAN PENJELASAN OPERASI? Delete beforeDelete YES. Berjalan sebelum operasi menghapus dibuat Delete afterDelete No Berjalan setelah operasi menghapus dibuat Dengan event di atas juga dapat didefinisikan aturan bisnis dalam model e1 e2 @3 4 es 6 e7 es 9 18 11 12 13 14 15 ? status == 'A') { echo "The robot is active, it can't b return false; } return true; } + i , Event Validasi Gagal 4 Selain itu jg ada event lainnya yang tersedia ketika proses validasi data menemukan ketidaksesuaian: OPERAS! NAMA PENJELASAN Insert atau update notSave Dipicu ketika INSERT atau UPDATE operasi gagal karena Insert, alasan apapun onValidationFails _Dipicu kelika setiap operasi manipulasi data gagal Delete atau Update Perilaku/Behaviour 4 Perilaku ini adalah salah satu bentuk pengolahan data pada model yg dapat diterapkan ke beberapa model. Sehingga dapat mengadopsi/ menggunakan kembali kode yg sama, ORM menyediakan API untuk menerapkan perilaku dalam model Anda. Juga, Anda dapat menggunakan event dan callback seperti yang terlihat sebelumnya sebagai alternatif untuk menerapkan Perilaku dengan lebih banyak kebebasan Sebuah perilaku harus ditambahkan dalam model initializer, model bebas memiliki perilaku bersama ini: e1 e2 3 04 es 6 e7 es e9 18 cee 12 13 14 15 16 17 18 19 20 21 22 23 24 25 addBehavior(new Timestampable( array( “beforeCreate’ => array( ‘field' => ‘created_at', ‘format’ "Y-m-d" 5 Perilaku built-in berikut disediakan oleh framework: NAMA DESKRIPSI Timestampable Memungkinkan untuk secara otomatis memperbarui model atribut tabungan datetime ketika record yang dibuat atau diperbarui SoftDelete —_Alih-alih secara permanen menghapus catatan itu menandai catatan sebagai dihapus mengubah nilai kolom bendera Timestampable 4 Perilaku ini menerima berbagai pilihan, key tingkat pertama harus nama event yang menunjukkan saat kolom harus dimodifikasi nilainya: e1| addBehavior(new Timestampable( @6 array( 97 “beforeCreate’ => array( e8 ‘field’ => 'created_at' @9 ‘format’ => 'Y-m-d' 10 ) 1 ) 12 3 13 | } Setiap event dapat memiliki pilihan sendiri, ‘field’ adalah nama dari kolom yang harus diperbarui, jika ‘format’ adalah string maka akan digunakan sebagai format dari fungsi PHP date, format yang juga bisa menjadi fungsi anonim memberikan Anda kebebasan untuk menghasilkan setiap jenis timestamp : e1| addBehavior(new Timestampable( 6 array( @7 “beforeCreate’ => array( 08 ‘field’ => 'created_at' @9 ‘format’ => function() { 10 $datetime = new Datetime(new 1 return $datetime->format('Y-m 12 } 13 ) 14 ) 15 ds 1s | } af i , Jika opsi ‘format’ dihilangkan timestamp menggunakan fungsi PHP time. SoftDelete 4 Perilaku ini dapat digunakan dengan cara berikut: @1] addBehavior(new SoftDelete( 21 array( 22 ‘field’ 23 ‘value’ = 24. ) 25 5 26 } 27 28} } DS ‘status’, Users: :DELETED Perilaku ini menerima dua pilihan: ‘field’ dan ‘value’; ‘field’ menentukan kolom apa harus diperbarui dan ‘value’ nilai yang akan dihapus. Mari kita menganggap tabel ‘users’ memiliki data sebagai berikut: @1| mysql> select * from users; @2] +----+------ ---+ @3| | id | name | status ea] + es] | 1a] lana | N e6] | 2 | Brandon | N 7 | +----+ + @8| 2 rows in set (0.00 sec) Jika kita menghapus salah satu record, status akan diperbarui bukannya menghapus record @1] delete(); Operasi ini akan menghasilkan data berikut dalam tabel 1] mysql> select * from users; in set (0.01 sec) Pethatikan bahwa Anda perlu menentukan kondisi record yg statusnya terhapus dalam query Anda untuk secara efektif mengabaikanya sehingga dianggap sebagai record yg telah dihapus, perilaku ini tidak bekerja hingga fungsi tsb. Menciptakan Perilaku Anda sendiri_ 7 ORM menyediakan AP! untuk membuat perilaku Anda sendiri. Sebuah perilaku harus menjadi class yang mengimplementasikan Phalcon \ MVC \ Model \ Behaviorlnterface. Juga, Phalon\MVC\Model\Behavior menyediakan sebagian besar metode yang diperlukan untuk mempermudah implementasi perilaku Perilaku berikut ini adalah contoh, menerapkan perilaku Blamable yang membantu mengidentifikasi pengguna yang melakukan operasi atas model @1] addBehavior(new Blamable()); ‘Sebuah perilaku juga mampu menangkap metode yg hilang pada model Anda e1 e2 3 04 es 6 e7 8 9 18 getSlug() Menggunakan Trait sebagai perilaku 4 Mulai dari PHP 5.4 Anda dapat menggunakan Trait untuk menggunakan kembali kode dalam class Anda, ini adalah cara lain untuk menerapkan perilaku kustom. Trait berikut mengimplementasikan versi sederhana dari perilaku Timestampable: e@1| created_at = date('r'); + che public function beforeUpdate() t 13 $this->updated_at = date('r'); } Kemudian Anda dapat menggunakannya dalam model Anda sebagai berikut: > e1| db->begin(); es @9 $robot = new Robots(); 10 11 $robot->name = "WALL-E"; 12 $robot->created_at = date("Y-m-d") 13 if ($robot->save() == false) { 14 $this->db->rollback(); 15 return; 16 } 17 18 $robotPart = new RobotParts(); 19 $robotPart ->robots_id = $robot->id 20 $robotPart->type = “head 2a if ($robotPart->save() == false) { 22 $this->db->rollback(); 23 return; 24 } 25 26 $this->db->commit() 28] } a i , Transaksi Implisit 7 Relasi yang ada dapat digunakan untuk menyimpan record dan instance terkait, operasi semacam ini secara implisit menciptakan transaksi untuk memastikan bahwa data yang disimpan dengan benar: e1| type = "head"; es @6 | $robot = new Robots(); 07] $robot->name = "WALL-E"; @8| $robot->created_at = date("Y-m-d") 9] $robot->robotPart = $robotPart; 10 11] $robot->save(); //Creates an implicit transaction a 7 , Transaksi Terisolasi 1 Transaksi terisolasi dijalankan dalam koneksi baru, memastikan semua SQL yang dihasilkan, pemeriksaan foreign key virtual dan aturan bisnis terisolasi dari koneksi utama.Transaksi semacam ini membutuhkan transaction manager yang secara global mengelola setiap transaksi yg dibuat, memastikan bahwa semua benar-benar rollback/commit sebelum mengakhiri request: @1] get(); 23 14 $robot = new Robots(); 15 $robot->setTransaction($transaction) ; 16 $robot->name = "WALL-E"; 17 $robot->created_at = date("Y-m-d") 18 if ($robot->save() == false) { 19 $transaction->rollback("Cannot save robot 20 } 21 22 $robotPart = new RobotParts(); 23 $robotPart->setTransaction($transaction) ; 24 $robotPart->robots_id = $robot->id; 25 $robotPart->type = "head"; 26 if ($robotPart->save() == false) { 27 $transaction->rollback("Cannot save robot 28 } 29 30 //Everything goes fine, let's commit the tran 31 $transaction->commit(); 32 33] } catch(TxFailed $e) { 34 echo "Failed, reason: ", $e->getMessage() 3s] } _—— a y Transaksi dapat digunakan untuk menghapus banyak catatan dengan cara yang konsisten e1 @3 04 es 06 7 es 9 10 a 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ? get(); //Get the robots will be deleted foreach (Robots::find("type = ‘mechanical'") $robot ->setTransaction($transaction) ; if ($robot->delete() == false) { //Something goes wrong, we should to foreach ($robot->getMessages() as $me $transaction->rollback($message->; } } //Everything goes fine, let's commit the tran $transaction->commit() ; echo "Robots were deleted successfully!"; } catch(TxFailed $e) { echo "Failed, reason: ", $e->getMessage() 321 } a i , Transaksi digunakan kembali di mana pun objek transaksi diambil. Sebuah transaksi baru yang dihasilkan hanya ketika commit() atau roliback() dilakukan. Anda dapat menggunakan wadah layanan untuk membuat manajer transaksi global untuk seluruh aplikasi: ? 1] setShared('transactions', function(){ 04 return new \Phalcon\Mvc\Model\Transaction\Man: es] 3); «1 it , Kemudian mengaksesnya dari controller atau view: 1] di->getTransactions() 11 12 //0r 13 $manager = $this->transactions; 14 15 //Request a transaction 16 $transaction = $manager->get() 17 18 Mase 19 } 20 21} } «f i , Sementara transaksi aktif, manajer transaksi akan selalu mengembalikan objek transaksi yang sama di seluruh aplikasi. Pemetaan Kolom Independen 4 ORM mendukung pemetaan kolom yang bebas, yang memungkinkan pengembang untuk menggunakan nama kolom yang berbeda dibandingkan dgn tabel yg terkait. Phalcon akan mengenali nama kolom baru dan akan mengubah nama mereka diserasikan dgn masing- masing kolom dalam database. Ini adalah fitur yang hebat ketika memiliki kebutuhan untuk mengubah nama field dalam database tanpa harus khawatir dgn semua kode query. Perubahan pada pemetaan kolom dalam model akan mengurus itu semua. Sebagai contoh: e1 e2 @3 04 es 6 7 es 9 10 1 12 2B 14 15 16 17 18 ‘code" ‘the_name’ => ‘theName', "the_type' "theType', “the_year' => ‘theYear’ ) + + i , Kemudian Anda dapat menggunakan nama-nama baru seperti biasa dalam kode Anda: e1 e2 @3 04 es 6 7 es 9 10 11 12 13 14 15 16 17 18 19 theName, "\n"; //Get robots ordered by type $robot = Robots::find(array(‘order' => '‘theType DI foreach ($robots as $robot) { echo ‘Code: ', $robot->code, "\n"; } //Create a robot $robot = new Robots(); $robot->code = '10101'; $robot->theName = ‘Bender’ $robot->theType = ‘Industrial’; $robot->theYear = 2999; $robot ->save() ; _ _ ee ad , Perhatikan hal-hal berikut ketika mengubah nama kolom Anda + Referensi atribut dalam relationship / validator harus menggunakan nama baru + Menggunakan nama kolom yang sebenamya akan menghasilkan exception pada ORM Manfaat pemetaan kolom independen ini antara lain: + Menuliskan aplikasi yang menggunakan kaidah/kenyamanan Anda sendiri + Menghilangkan prefiks / sufiks dr vendor dalam kode Anda + Mengubah nama kolom tanpa mengubah kode aplikasi Anda Operasi Pada Resultset 4 Jika resultset yang terdiri dari objek lengkap, ResultSet adalah kemampuan untuk melakukan operasi pada record yang diperoleh dengan cara yang sederhana: Memperbarui record terkait 4 Alih-alih melakukan hal ini: e1| getParts() as $part) { 04 $part->stock = 100; 5 $part->updated_at = time(); @6 if ($part->update() == false) { @7 foreach ($part->getMessages() as $message e8 echo $message; e9 10 break; 11 12] } a i Anda dapat melakukan ini @1] getParts()->update(array( 4, ‘stock’ => 100, @s ‘updated_at’ => time( 6] )); ‘Update’ juga menerima fungsi anonim untuk menyaring record mana yg harus diperbarui @1] 100, es ‘updated_at' => time() a6} ) a8 | //Update all the parts except these whose type is 9] $robots->getParts()->update($data, function($part 108 if ($part->type == Part::TYPE_BASIC) { 1 return false; 12 13 return true; 14] })5 # i , Menghapus record terkait 4 Alih-alih melakukan hal ini: 1] getParts() as $part) { 04 if ($part->delete() false) { @s foreach ($part->getMessages() as $message 6 echo $message; e7 e8 break; 29 } ae} } ‘Anda dapat melakukan ini e1| getParts()->delete(); ‘Delete’ juga menerima fungsi anonim untuk menyaring apa catatan harus dihapus: e1] getParts()->delete(function($part) { es. if ($part->stock < @) { @6 return false; e7 @8 return true; eo] 3); a i , Snapshot Record 4 Model tertentu bisa diatur untuk mempertahankan snapshot record ketika di-query. Anda dapat menggunakan fitur ini untuk melaksanakan audit atau hanya untuk mengetahui kolom apa yang berubah sesuai dengan query data yg tersimpan e@1| keepSnapshots (true) ; Ketika mengaktifkan fitur ini aplikasi mengkonsumsi memori sedikit lebih besar untuk melacak nilai-nilai asli yang diperoleh dari data yg tersimpan. Dalam model dimana fitur ini diaktitkan, Anda dapat memeriksa kolom apa yg berubah e1| name = ‘Other name’ e8 e9| var_dump($robot->getChangedFields()); // ['name* 1@| var_dump($robot->hasChanged('name')); // true 11 | var_dump($robot->hasChanged(‘type')); // false Model Meta-Data 7 Untuk mempercepat pengembangan, Phalcon \ MVC \ Mode! membantu Anda untuk query kolom dan constraint/batasan dari tabel yang terkait dengan model. Untuk mencapai hal ini, Phalcon \ MVC \ Model \ metadata tersedia untuk mengelola dan men-cache tabel meta- data. Kadang-kadang diperlukan untuk mendapatkan atribut-atribut ketika bekerja dengan model. Anda bisa mendapatkan instance meta-data sebagai berikut: e1| getModelsMetaData(); 07 8] // Get robots fields names @9] $attributes = $metaData->getAttributes($robot) ; 1@| print_r($attributes) ; 1 12| // Get robots fields data types 13 | $datatypes = $metabata->getDataTypes($robot) ; 14| print_r($dataTypes) ; Caching Meta-Data 7 Setelah aplikasi ini dalam tahap produksi (diterapkan pada lapangan sebenamya), tidak perlu untuk query meta-data tabel dari sistem database setiap kali Anda menggunakan tabel. Ini dapat dilakukan caching meta-data menggunakan salah satu adapter berikut ADAPTOR DESKRIPSI API Memory Ini adalah adaptor default. Meta-data di-cache hanya selama request. Ketika_Phalcon \MVC.\ request selesai, meta-data dihapus dianggap sebagai bagian dari Mode! \metadata \ ‘memori request normal. Adaptor ini sangat cocok ketika aplikasi dalam Memo: development sehingga dapat me-refresh meta-data dalam setiap request yang berisi kolom baru dan / atau moditikasi Session Adapter ini menyimpan meta-data dalam $_SESSION superglobal. Adaptor Phalcon \MVC \ ini hanya disarankan saat aplikasi benar-benar menggunakan sejumlah kecil_ Model \metadata \ ‘model. Meta-data refresh setiap kali sesi baru dimulai. Hal ini juga Session memerlukan penggunaan session_start() untuk memulai sesi sebelum menggunakan model apapun. Ape XCache Files ‘Adaptor ini menggunakan Alternative PHP Cache (APC) untuk menyimpan _Phalcon \MVC\ meta-data tabel. Anda dapat menentukan masa-pakai meta-data dengan Model \ metadata \ opsinya. Ini adalah cara yang paling dianjurkan untuk menyimpan meta-data APC. bila aplikasi tersebut dalam tahap produks| ‘Adaptor ini menggunakan XCache untuk menyimpan meta-data tabel. Anda con dapat menentukan masa-pakai meta-data dengan opsinya, Ini adalah cara Model \metadata\ ‘yang paling dianjurkan untuk menyimpan meta-data bila aplikasitersebut - XCache dalam tahap produksi Adaptor ini menggunakan fle biasa untuk menyimpan meta-data. Dengan _Phalcon \MVC.\ menggunakan adaptor ini pembacaan-disk meningkattetapi akses database Model \metadata \ berkurang Sebagai dependensi lain ORM, metadata-manajer diambil dari wadah layanan 1] 86400, e8 “prefix” => "my-prefix" eo ») 10 11 return $metaData; 12] 3; « ii , Strategi Meta-Data 4 Seperti disebutkan di atas strategi default untuk mendapatkan meta-data model adalah basis data introspeksi. Dalam strategi ini, skema informasi digunakan untuk mengetahui bidang dalam sebuah tabel, kunci primer, bidang nullable, tipe data, dll Anda dapat mengubah default meta-data introspeksi dengan cara sebagai berikut e1 @3 04 es 6 setStrategy(new MyInstrospectionSti return $metaData; i Strategi Introspeksi Database 7 Strategi ini tidak memerlukan kostumisasi apapun dan secara implisit digunakan oleh semua adapter meta-data. Strategi Anotasi 4 Strategi ini memanfaatkan Annotations (penjelasan) untuk menggambarkan kolom dalam model: e1 e2 e3 04 es 6 e7 es e9 18 11 12 13 14 15 16 17 18 19 28 21 22 23 24 25 26 27 28 86400, 1 “prefix” "my-prefix" 12 d)3 13 14 //Set a custom meta-data database introspectii 15 $metaData->setStrategy(new StrategyAnnotation: 16 17 return $metaData; 1s | }; a) , Panduan Meta-Data 4 Phalcon dapat memperoleh metadata untuk setiap model secara otomatis tanpa pengembang harus mengatur secara manual dengan menggunakan salah satu strategi introspeksi yang disajikan di atas. Pengembang juga memiliki pilihan untuk menentukan metadata secara manual. Strategi ini menimpa setiap strategi yang ditetapkan pada manajer meta-data. Kolom baru ditambahkan J diubah / dihapus ke / dari tabel yg dipetakan harus ditambahkan / diubah / dihapus juga agar berfungsi dengan benar. Contoh berikut ini menunjukkan bagaimana untuk menentukan meta-data secara manual: ? e@1| array( 16 ‘id', ‘name’, ‘type’, ‘year’ 17 » 18 19 //Every column part of the primary ke: 20 MetaData f1ODELS_PRIMARY_KEY => array 24 ‘id’ 22 » 23 24 //Every column that isn't part of the 25 MetaData f1ODELS_NON_PRIMARY_KEY => ai 26 ‘name’, ‘type’, “year' 27 ds 28 29 //Every column that doesn't allows nu 30 MetaData: :MODELS_NOT_NULL => array( 31 ‘id’, ‘name’, ‘type’, ‘year’ 32 ds 33 34 //Every column and their data types 35, MetaData: :MODELS_DATA_TYPES => array( 36 ‘id’ => Column: :TYPE_INTEGER, 37 ‘nam Column: : TYPE_VARCHAR, 38 ‘type’ => Column: :TYPE_VARCHAR, 39 ‘year’ => Column: :TYPE_INTEGER 40 )» 41 42 //The columns that have numeric data 43 MetaData (ODELS_DATA_TYPES_NUMERIC = 44 ‘id’ => true; 45 "year' => true, 46 )» 47 48 //the identity column, use boolean fa 49 //an identity column 58 MetaData (ODELS_IDENTITY_COLUMN => * 51 52 //How every column must be bound/cast! 53 MetaData: :MODELS_DATA_TYPES BIND => a 54 ‘id’ Column: :BIND_PARAM_INT, 55 “name* Column: : BIND_PARAM_STR, 56 ‘type! => Column: :BIND_PARAM_STR, 57 "year' => Column::BIND_PARAM_INT, 58 » 59 68 //Fields that must be ignored from IN 61 MetaData: :MODELS_AUTOMATIC_DEFAULT_IN 62 "year' => true 63 )» 64 65 //Fields that must be ignored from UPI 66 MetaData: :MODELS_AUTOMATIC_DEFAULT_UP! 67 "year' => true 68 ) 69 78 )3 7 } 72 731} <_< Menunjuk ke skema/databse yang berbeda 4 Jika model dipetakan ke tabel yang berada dalam skema/database yang berbeda dari default. Anda dapat menggunakan metode getSchema untuk menentukan bahwa e1| set(‘dbMysql', function() { es return new \Phalcon\Db\Adapter\Pdo\Mysql (arr. a6 "host" => "localho @7 “username” => "roo e8 "password e9 “dbname” 10 3 a1] 3); 12 13| //This service returns a PostgreSQL database 14| $di->set(‘dbPostgres', function() { 15 return new \Phalcon\Db\Adapter\Pdo\PostgresQ 16 "host" => "localhost", 17 “username” => "postgres", 18 “password 19 "dbname" => "invo" 20 3 21] })3 « i , Kemudian, dalam metode Initialize, kita mendefinisikan layanan koneksi untuk model ? e@1| setConnectionService('dbPostgres') e9 } 10 a1} } «{ m. , Tapi Phalcon menawarkan fleksibilitas yang lebih, Anda dapat menentukan koneksi yang harus digunakan untuk ‘membaca’ dan ‘menulis’. Hal ini khususnya berguna untuk menyeimbangkan beban ke database Anda untuk menerapkan arsitektur master-slave: e1| setReadConnectionService(' dbSlave eo $this->setWriteConnectionService( 'dbMaste| 10 } 11 12] af i , ORM juga menyediakan fasilitas Sharding Horizontal, dengan memungkinkan Anda untuk menerapkan ‘shard’ (pecahan) seleksi menyesuaikan dengan kondisi query saat ini e1] @ && $id < 10000) { 23 return $this->getDI()->get('dl 24 } 25 if ($id > 10000) { 26 return $this->getDI()->get(‘di 27 } 28 } 29 } 30 31 //Use a default shard 32 return $this->getDI()->get(‘dbShardo' ) 33 } 34 35] } 1 Mm, , Metode ‘selectReadConnection’ dipanggil untuk memilih koneksi yang tepat, metode ini memotong (intercept) setiap query baru yg dieksekusi e1] set(‘db', function() { e9 108 $eventsManager = new EventsManager(); 11 12 $logger = new Logger("app/logs/debug. log"); 13 14 //Listen all the database events 15 $eventsManager->attach('db', function($event, 16 if ($event->getType() == ‘beforeQuery') { 17 $logger->1log($connection->getSQLStater 18 19 5 20 21 $connection = new Connection(array( 22 "host" localhost", 23 “username” "root", 24 “password” => “secret”, 25 "dbname" => "invo" 26 5 27 28 //Assign the eventsManager to the db adapter 29 $connection->setEventsManager ($eventsManager) 30 31 return $connection; 321 })5 a i , Sebagaimana model mengakses koneksi database default, semua pernyataan SQL yang dikirim ke sistem database akan dicatat dalam file: 1] name = "Robby the Robot"; @5 | $robot->created_at = "1956-97-21" a6 | if ($robot->save() == false) { @7 echo "Cannot save robot"; es} } Seperti di atas, aplikasi / file log / db.log akan berisi sesuatu seperti ini ? @1| [Mon, 30 Apr 12 13:47:18 -@500] [DEBUG] [Resource I @2] (name, created_at) VALUES (‘Robby the Robot’, '19) (il ' Profiler Statemen SQL 4 Berkat Phalcon \ Db , Komponen yang mendasari Phalcon \ MVC \ Model , sangat mungkin untuk membuat profile pernyataan SQL yang dihasilkan oleh ORM dalam rangka untuk menganalisis kinerja operasi database. Dengan ini Anda dapat mendiagnosa masalah kinerja dan untuk menemukan bottleneck e1| set( ‘profiler’, function(){ 04 return new \Phalcon\Db\Profiler(); 5] }, true); 26 @7| $di->set('db', function() use ($di) { es e9 $eventsManager = new \Phalcon\Events\Manager( 10 coe //Get_a shared instance of the DbProfiler 12 $profiler = $di->getProfiler(); 23 14 //Listen all the database events 15 $eventsManager->attach(‘db', function($event, 16 if ($event->getType() == ‘beforeQuery') { 17 $profiler->startProfile($connection->, 18 } 19 if ($event->getType() == ‘afterquery') { 20 $profiler->stopProfile(); 21 } 22 » 23 24. $connection = new \Phalcon\Db\Adapter\Pdo\Mys: 25 “host™ “localhost”, 26 “username” => "root", 27 "password" => "secret", 28 “dbname” => “invo" 29 ») 30 31 //dssign the eventsManager to the db adapter 32 $connection->setEventsManager ($eventsManager) 33 34, return $connection; 35] })5 a ee] E Profiling beberapa query: e1 e2 @3 4 es 6 e7 es 9 18 1 12 13 14 15 16 get('profiler')->getProfiles(); foreach ($profiles as $profile) { echo "SQL Statement: ", $profile->getSQLstatem echo "Start Time: ", $profile->getInitialTime( echo "Final Time: ", $profile->getFinalTime(), echo "Total Elapsed Time: ", $profile->getTota i , Setiap profil yang dihasilkan mengandung durasi dalam milidetik bahwa setiap instruksi yang diperlukan untuk menyelesaikan serta statemen SQL yang dihasilkan. Injeksi Service Dalam Model 7 Anda mungkin diminta untuk mengakses layanan aplikasi dalam model, contoh berikut menjelaskan cara untuk melakukannya: e1| getDI()->getFlash(); 11 //Show validation messages 12 foreach ($this->getMessages() as $message 13 $flash->error ($message) ; 4 } (i __e i , Event “notSave" dipicu setiap kali action “create” atau “update” gagal. Jadi kita flash pesan validasi dgn memperoleh layanan “flash” dari wadah DI. Dengan melakukan ini, kita tidak harus mencetak pesan setiap selesai save. Menonaktifkan / Mengaktifkan Fitur 9 Dalam ORM kami telah menerapkan mekanisme yang memungkinkan Anda untuk mengaktifkan / menonaktifkan fitur khusus atau opsi global dengan cepat. Sebagaimana Anda menggunakan ORM, Anda dapat menonaktifkan yg tidak Anda gunakan. Opsi ini juga dapat dinonaktifkan sementara jika diperlukan: e1| false, es ‘columnRenaming’ => false e6]} ))5 Pilihan yang tersedia adalah: PILIHAN DESKRIPS! KEGAGALAN events Mengaktifkan / Menonaktifkan callback, kait dan pemberitahuan eventdari_benar semua model columnRenaming — Mengaktifkan / Menonaktifan penggantian nama kolom benar notNullValidations ORM otomatis memvalidasi kolom tidak null hadir dalam tabel yg benar dipetakan virtualForeignKeys | Mengaktifkan / Menonaktifkan foreign key virtual benar phqlLiterals Mengaktifkan / Menonaktian literal dalam parser PHOL benar Komponen Stand-Alone 4 Menggunakan Phalcon \ Mvc \ Mode! dalam mode stand-alone dapat ditunjukkan di bawah ini e1 e2 @3 04 es 6 7 es e9 18 11 12 13 14 15 16 17 18 19 28 21 22 23 24 25 26 27 28 29 set(‘db', new Connection(array( "dbname" => "sample.db" 5 //Set a models manager $di->set(‘modelsManager', new ModelsManager()) ; //Use the memory meta-data adapter or other $di->set(‘modelsMetadata', new MetaData()); //Create a model class Robots extends Model { } /JUse the model echo Robots: :count() 5 i , Terjemah dari Bekerja dengan Model Phalcon http://c halconphy meni reference/m Is.html

You might also like