2013年10月15日 星期二

yii framework - 建立一個部落格要建立CRUD時候出錯了?

我想學 官網的部落格範例 一樣嘗試用yii建立一個blog, 但是在建立完model後, 要用
Crud Generator卻出現下面的error:

CDbCommand failed to execute the SQL statement: CDbCommand failed to prepare the SQL statement: SQLSTATE[HY000]: General error: 1 near ".": syntax error. The SQL statement executed was: PRAGMA table_info('tbl_comment'.'tbl_post')

config資料夾裡的main.php的db設定是這樣

'db'=>array(
'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/blog.db',
'tablePrefix'=>'tbl_', //<- 加上這句告訴db我們資料表的前綴字是什麼

),

跟大陸的教學一樣但是還是不行, 為什麼會這樣呢?




結果是我把它說的

提示: 我们还可以在 Table Name 栏中输入一个星号 '*' 。这样就可以通过一次点击就对 所有的 数据表生成相应的模型类。

看成是輸入'.*' , 真他媽要命阿! 就因為這個我搞了兩天...., 後來自己以為Gii對的說明裡面的schemaName.*說的是同一件事, 各種眼睛脫窗+自以為阿~ 但是也學到不少(讓我安慰一下自己吧)



從中學到的東西:

1. 如果資料表有前綴字, 無論你是在config/main.php或是在Gii的Table Prefix加上前綴字, 只要在Table Name輸入一個* , 通通都可以.

1. 當你將Gii的Table Prefix設成你的前綴字, 再把Table Name打成joker.*的話, 產生的code會是這樣:

class Post extends CActiveRecord
{
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'joker.tbl_post';
}

懂嗎? *不只是一次建立所有的model, 它可以自己抓所有的資料表名稱, 而且如果你有特殊的資料庫結構的話還可以再前面加上字來提醒自己, 例如你這個資料庫所有的資料表都是公開的話, 那就可以設成public.* , 就會變這樣

class Post extends CActiveRecord
{
/**
* @return string the associated database table name
*/
public function tableName()
{
return 'public.tbl_post';
}

ps: 在models資料夾產生的所有檔案, 裡面的tableName()都會加上public這個我們加上的字.


中間發現的小現象+心得:

如果你是在config/main.php裡加上前綴字, 就像這樣

'db'=>array( 'connectionString' => 'sqlite:'.dirname(__FILE__).'/../data/blog.db', 'tablePrefix'=>'tbl_', ),

那在models/Post.php產生的程式裡會是這樣

class Post extends CActiveRecord
{
....

public function tableName()
{
return '{{post}}';
}

如果你是在Gii的Table Prefix加上前綴字, 就像這樣



那在models/Post.php產生的程式裡會是這樣

class Post extends CActiveRecord
{
....

public function tableName()
{
return 'tbl_post';
}

這兩種都可以順利建立起來model+Crud, 第二種產生的code看起來很直覺似乎比較好, 但是仔細看一下官方的說明後發現第一種方式更好, 用兩大括弧包住(例如 {{post}}) 它能在執行的時候自己加上前綴字(例如 tbl_post), 所以好處在於之後如果資料庫的前綴字改的話, 我們只需要改config/main.php就好了! models資料夾裡面的東西通通不用動就可以正常運作了! (真的太神啦~)

要不然以blog的例子, 資料庫改前綴字後會動到


config/main.php

models/Comment.php
models/Lookup.php
models/Post.php
models/Tag.php
models/User.php

六個檔案...

沒有留言:

張貼留言