Yii2框架的幾個隊列的坑
摘要:Yii2是一款優秀的通用Web框架,結構簡單優雅、實用功能豐富、擴展性強、性能搞是他最突出的優點。它很好的地方你在使用過程中總能輕易的發現,避免贅述。而這些位置的小瑕疵,更多需要大家告訴。
說點閒話
ActiveRecord被莫名寫入?
思考才是進步的來源動力!
好了,扯淡完畢,步入正題。
ActiveRecord被莫名寫入? 準備知識
ActiveRecord
的基本用法。如果不理解,可參考這裡。程式碼現場
<span>/**</span><span> * @property integer $id</span><span> * @property string $name</span><span> * @property string $detail</span><span> * @property double $price</span><span> * @property integer $area</span><span> **/</span><span>class OcRoom extends ActivieRecord</span><span>{</span><span> ...</span><span>}</span><span>$room = OcRoom::find() //先取出一个对象。</span><span> ->select(['id']) //只取出'id'列</span><span> ->where(['id'=>20])</span><span> ->one();</span><span>$room->save(); //保存,会发现此行的其它字段都被写成默认值了。</span>
總結問題
$room
我從資料庫中取出了一行,也就是程式碼中的
$room我從資料庫中取出了一行,也就是程式碼而其他欄位自然就是預設值。
當我
$room->save()也就是說,當你想節約資源,不取出所有欄位的時候,一定要注意不能儲存,否則,很多資料會被莫名修改為預設值。
自己時時刻刻注意,避免未完全取出的
ActiveRecord修改或繼承
ActiveRecord新建,且欄位沒有完全取出,呼叫
save()方法,拋出異常。
修改或繼承
ActiveRecord新建,且字段沒有完全取出,調用
save()方法時,只保存取出過的字段,其他字段被忽略。
你的Transaction生效了嗎? <span>/**</span><span> * @property integer $id</span><span> * @property string $name</span><span> **/</span><span>class OcRoom extends ActiveRecord</span><span>{</span><span> public function rules()</span><span> {</span><span> return [['name','string','min'=>2,'max'=>10]];</span><span> }</span><span> ...</span><span>}</span><span>class OcHouse extends ActiveRecord</span><span>{</span><span> public function rules()</span><span> {</span><span> return [['name','string','max'=>10]];</span><span> }</span><span> ...</span><span>}</span><span>$a = new OcRoom();</span><span>$a->name = ''; //name为空字符串,不满足rules()条件。</span><span>$b = new OcHouse();</span><span>$b->name = '我的房间'; //name合法,可以保存。</span><span>$transaction = Yii::$app->db->beginTransaction();</span><span>try{</span><span> $a->save(); //name字段不合法,无法验证通过,在validate()阶段已经返回false,不会进行数据库存储的步骤,所以也不会抛出异常。</span><span> $b->save(); //name字段合法,可以正常保存。</span><span> $transaction->commit(); //提交后,发现$a保存失败,而$b保存成功。</span><span>}</span><span>catch (Exception $e) </span><span>{</span><span> Yii::error($e->getTraceAsString(),__METHOD__);</span><span> $transaction->rollBack();</span><span>}</span>問題總結這段程式碼的問題在於:
大家知道
$transaction顯然,在這個例子中,
transaction因為
validate()都沒過,所以
$transation->commit()的時候並不會報錯誤。
解決方法$transation
塊內,所有的save()都要判斷下回傳值,如果為
false,則直接拋出異常。
'Y-m-d'不被辨識?
<span>OcRenterBill extends ActiveRecord</span><span>{</span><span> public function rules()</span><span> {</span><span> return [</span><span> ['start_time','date','format'=>'Y-m-d'],</span><span> ];</span><span> }</span><span>}</span><span>$a = new OcRenterBill();</span><span>$a = '2015-09-12';</span><span>$a->save(); //会报错,说格式不对。</span>問題總結如果一開始,Yii框架就報錯,這個還不算坑。坑的是我在Mac上開發時,這個可以完全正常的工作,而發佈到線上環境(Ubuntu)後,就彈出“屬性start_time格式無效”的錯誤。而參考官方文檔,發現這種格式是允許的官方文檔。 啊啊啊。各種試錯,最後發現如果改成
php:Y-m-d
,世界就清淨了。所以,如果你遇到這種問題,感激我吧。