1 驗證用Regex
<?php
class User extends AppModel
{
var $name = 'User';
var $validate = array(
'username' => '/^.{6,40}$/',
'password' => '/^.{6,40}$/',
'email' => VALID_EMAIL
);
}
?>
這個Regex的意思就是 “從字串的開頭開始,有至少 6 個但不超過 40 個字元,然後字串結束”。
從左至右閱讀這個Regex:
/ — 表示Regex的開頭
^ — 表示字串的開頭
. — 表示任意一個字元
{6,40} — 表示至少 6 次,但不能超過 40 次
$ — 表示字串結束
/ — 表示Regex結束
2 在資料進入資料庫前,先判斷是否重複輸入
在model層中輸入
function beforeValidate() {
if (!$this->id) {
if ($this->findCount(array('User.username'
=> $this->data['User']['username'])) > 0) {
$this->invalidate('username_unique');
return false;
}
}
return true;
}
並且在view層中給出資訊
echo $form->input('username', array('after' => $form->error
('username_unique', 'The username is taken. Please try again.')));
這個方法告訴模型,在運行任何檢驗之前,應該檢查提交的資料是否有 ID。如果沒有 ID,就尋找使用者名稱相同的其他使用者。如果
找到這樣的使用者,就將使用者名稱欄位標為無效,並跳過其他檢驗(返回 false)。通過將 register.ctp 視圖中的使用者名稱輸入行改為清
單 24 所示的代碼,就可以啟用這個功能。
2 用bake來產生架構
注意必須建立好model層後再用!
把cake\console以及php目錄底下的php.exe所在的路徑加到path中去。之後在app目錄下運行
cake bake即可一步步去做control層,view層的crud.
3
一對多的例子:
authors,books表中,一對多的關係
author.php中
<?php
class Author extends AppModel
{
var $name = 'Author';
var $hasMany = array ('Book' => array(
'className' => 'Book','foreignKey'=>'author_id')
);
}
?>
book.php表
<?php
class Book extends AppModel
{ var $name = 'Book';
var $belongsTo = array ('Author' => array(
'className' => 'Author','foreignKey'=>'author_id')
);
}
?>
然後假設authors表中已有資料
books_controller.php:
<?php
class BooksController extends AppController {
var $name = 'Books';
var $scaffold;
}
其中在錄入book表時,應該會有authors的下拉框供選擇。
一對多中,一方如果和多個多方有關聯,可以這樣寫:
var $hasMany = array(
'Book' => array(
'className' => 'Book',
),
'Tutorial' => array(
'className' => 'Tutorial',
)
);
4 一對多的最終例子
model層
book.php:
<?php
class Book extends AppModel
{ var $name = 'Book';
var $belongsTo = array ('Author' => array(
'className' => 'Author','foreignKey'=>'author_id')
);
}
?>
author.php
<?php
class Author extends AppModel
{
var $name = 'Author';
var $hasMany = array ('Book' => array(
'className' => 'Book','foreignKey'=>'author_id')
);
}
?>
控制層 books_controller.php
<?php
class BooksController extends AppController {
var $name = 'Books';
var $helpers = array('Form');
function index() {
$this->Book->recursive = 1;
$books = $this->Book->find('all',
array('fields' =>
array('Book.isbn','Book.title','Author.name')
)
);
$this->set('books',$books);
}
function add() {
if (!empty($this->data)) {
$this->Book->create();
$this->Book->save($this->data);
$this->redirect(array('action'=>'index'));
}
//注意在1.2中,不用helper類的generalist了。用find
$authors =$this->Book->Author->find('list',array('fields'=>'Author.name'));
$this->set('authors',$authors);
}
}
?>
authors_controller.php
<?php
class AuthorsController extends AppController {
var $name = 'Authors';
function index() {
$this->Author->recursive = 1;
$authors = $this->Author->find('all');
$this->set('authors', $authors);
}
}
?>
view層
views\authors\index.thtml
<?php foreach($authors as $author): ?>
<h2><?php echo $author['Author']['name'] ?></h2>
<hr />
<h3>Book(s):</h3>
<ul>
<?php foreach($author['Book'] as $book): ?>
<li><?php echo $book['title'] ?></li>
<?php endforeach; ?>
</ul>
<?php endforeach; ?>
views\books\index.thtml
<table>
<thead>
<th>ISBN</th><th>Title</th><th>Author</th>
</thead>
<?php foreach($books as $book): ?>
<tr>
<td><?php echo $book['Book']['isbn'] ?></td>
<td><?php echo $book['Book']['title'] ?></td>
<td><?php echo $book['Author']['name'] ?></td>
</tr>
<?php endforeach; ?>
</table>
views\books\add.thtml
<?php echo $form->create('Book');?>
<fieldset>
<legend>Add New Book</legend>
<?php
echo $form->input('isbn');
echo $form->input('title');
echo $form->input('description');
echo $form->input('author_id');
?>
</fieldset>
<?php echo $form->end('Submit');?>
5 一對多中,刪除一方時,如果要串聯刪除多方,這樣設定
var $hasMany = array(
'Book' => array(
'className' => 'Book',
'dependent'=> true
)
);
6 多對多,假設book和author關係為多對多
model層
book.php
<?php
class Book extends AppModel
{
var $name = 'Book';
var $hasAndBelongsToMany = 'Author';
}
?>
author.php
<?php
class Author extends AppModel
{
var $name = 'Author';
var $hasAndBelongsToMany = 'Book';
}
?>
controll層
books_controller.php
<?php
class BooksController extends AppController {
var $name = 'Books';
var $helpers = array( 'Form' );
function index() {
$this->Book->recursive = 1;
$books = $this->Book->find('all');
$this->set('books', $books);
}
function add() {
if (!empty($this->data)) {
$this->Book->create();
$this->Book->save($this->data);
$this->redirect(array('action'=>'index'), null, true);
}
$authors =$this->Book->Author->find('list',array('fields'=>'Author.name'));
$this->set('authors', $authors);
}
}
?>
authors_controller.php
<?php
class AuthorsController extends AppController {
var $name = 'Authors';
function index() {
$this->Author->recursive = 1;
$authors = $this->Author->find('all');
$this->set('authors', $authors);
}
}
?>
view層
view\book\index.thtml
<?php foreach($books as $book): ?>
<h2><?php echo $book['Book']['title'] ?></h2>
<hr />
<h3>Author(s):</h3>
<ul>
<?php foreach($book['Author'] as $author): ?>
<li><?php echo $author['name'] ?></li>
<?php endforeach; ?>
</ul>
<?php endforeach; ?>
view\author\index.thtml
<?php foreach($authors as $author): ?>
<h2><?php echo $author['Author']['name'] ?></h2>
<hr />
<h3>Book(s):</h3>
<ul>
<?php foreach($author['Book'] as $book): ?>
<li><?php echo $book['title'] ?></li>
<?php endforeach; ?>
</ul>
<?php endforeach; ?>
view\books\add.thtml
<?php echo $form->create('Book');?>
<fieldset>
<legend>Add New Book</legend>
<?php
echo $form->input('isbn');
echo $form->input('title');
echo $form->input('description');
echo $form->input('Author');
?>
</fieldset>
<?php echo $form->end('Submit');?>