在使用phalcon的insert和update功能時,因為資料庫所有的欄位設定的都是NOT NULL,而phalcon的model在插入或更新之前會自動判斷欄位是否需要必填,因此導致有空欄位時無法存入。
開始遇到這問題時,想到兩種解決方法:
一、改資料庫欄位,把NOT NULL改為可以為空。
但該資料庫還得去找DBA,而且為了效能,DBA要求一般沒有特殊情況,欄位必須是NOT NULL,所以該方案否決。
二、給可以為空的欄位設定預設值。
想過各種預設值,覺得空格最符合,但是賦值空格後,資料庫裡存的也會是空格,像一些empty和==''等判斷會失效,很可能會影響一些業務邏輯,想想,還是放棄該方案。
最後還是上網各種搜,phalcon的資料太少,百度根本搜不出來,最後轉戰google,功夫不負有心人,終於給我找到些蛛絲馬跡,最後再根據蛛絲馬跡找出來真正的解決方案。同樣有兩種,如下:
一、給可以為空的欄位單獨設定規則
public function skipValidation($skipers=[]) { foreach ($skipers as $skiper) { if (empty($this->$skiper)) { $this->$skiper = new \Phalcon\Db\RawValue('""'); } } }
使用的時候:
public function beforeValidation() { $this->skipValidation(['tag','source_url']); }
這種方法可以完美解決問題,比較麻煩的是,需要設定每個可以為空的欄位。
二、關閉phalcon對欄位是否為空的判斷
public function initialize(){ $this->setup( array('notNullValidations'=>false) ); }
該方法直接把底層判斷欄位是否為空的邏輯關閉了,可以一勞永逸的解決這個問題,缺點就是,自己前後臺得做好必填欄位的判斷。
三、另外的方案
解決方法一:
進行賦值插入資料庫失敗,發現非空欄位不能在model下beforeCreate裡面賦值,
只能是:
$user = new Users();
下直接賦值:
$user->action_act = "y"
解決方法二:
換成:beforeValidationOnCreate