Hi, I got a problem about models.
DBAs in our company do not allow NULL fields for MySQL. So I have to set NOT NULL for every field. Indeed, you can give it a default value, and skip it when inserting/updating. But things are complicated, there are always empty values for them.
And we know phalcon has a district validation for models. So What can I do?
I found that phalcon\mvc\model has skipAttributes() method to solve this problem.
public function beforeValidation()                       
{                                                        
    $this->modtime = date("Y-m-d H:i:s");                
    $emptyAttr = array();                                
    $attrs = $this->toArray();                           
    foreach($attrs as $key => $attr) {                   
        if(empty($attr) && $key != 'addtime') {          
            $emptyAttr[] = $key;                         
        }                                                
    }                                                                               
    $this->skipAttributes($emptyAttr);                   
}                                                        I tried it, And got a problem.
I want to parse XMLs and make them into MySQL. Bottom is the table schema. Field "assetnetvalue" in xml always has a non-empty value, but when I insert them in, the field "assetnetvalue" is empty for 2/3 of the records. So Why? It was skipped? No, I just var_dump the emptyArr for every record, and there is no "assetnetvalue". But the SQL told us it was skipped. See it below:
<ROW seqno="5257">                         
  <YHCODE>3878</YHCODE>                    
  <FUNDCODE>519886</FUNDCODE>              
  <PUBDATE>2013-12-31 0:00:00</PUBDATE>    
  <ASSETNETVALUE>8286773.69</ASSETNETVALUE>
  <SHARESCOPE>8286773.69</SHARESCOPE>      
</ROW>                                     INSERT INTO `fnd_nav` (`yhcode`, `fundcode`, `pubdate`, `modtime`, `addtime`) VALUES ('3878', '519886', '2013-12-31 0:00:00', '2014-04-10 21:15:44', '2014-04-10 21:15:44')So Why ???
CREATE TABLE `fnd_nav` (
 `id` bigint(10) NOT NULL AUTO_INCREMENT,
 `yhcode` varchar(10) NOT NULL DEFAULT '',
 `fundcode` varchar(6) NOT NULL DEFAULT '',
 `pubdate` varchar(31) NOT NULL DEFAULT '0000-00-00 00:00:00',
 `netvaluechg` decimal(20,18) NOT NULL DEFAULT '0.000000000000000000',
 `netvalue` decimal(10,5) NOT NULL DEFAULT '0.00000',
 `totalvalue` decimal(10,5) NOT NULL DEFAULT '0.00000',
 `totalvalueconvert` decimal(20,15) NOT NULL DEFAULT '0.000000000000000',
 `rwfnetvalue` decimal(10,4) NOT NULL DEFAULT '0.0000',
 `qrnhprofit` decimal(10,3) NOT NULL DEFAULT '0.000',
 `fundjztype` varchar(10) NOT NULL DEFAULT '',
 `assetnetvaluemain` decimal(20,2) NOT NULL DEFAULT '0.00',
 `sharescopemain` decimal(20,2) NOT NULL DEFAULT '0.00',
 `assetnetvalue` decimal(20,2) NOT NULL DEFAULT '0.00',
 `sharescope` decimal(20,2) NOT NULL DEFAULT '0.00',
 `h_rwfnetvalue` decimal(10,4) NOT NULL DEFAULT '0.0000',
 `h_qrnhprofit` decimal(10,3) NOT NULL DEFAULT '0.000',
 `h_fundjztype` varchar(10) NOT NULL DEFAULT '',
 `modtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 `addtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
 PRIMARY KEY (`id`),
 UNIQUE KEY `yhcode` (`yhcode`,`fundcode`,`pubdate`)
) ENGINE=InnoDB AUTO_INCREMENT=5329 DEFAULT CHARSET=utf8