今天又碰到phalcon的一个坑了
phalcon版本2.0.8
Model类create方法,代码示例有两种方式
//Creating a new robot
$robot = new Robots();
$robot->type = 'mechanical';
$robot->name = 'Astro Boy';
$robot->year = 1952;
$robot->create();
//Passing an array to create
$robot = new Robots();
$robot->create(array(
'type' => 'mechanical',
'name' => 'Astroy Boy',
'year' => 1952
));
以为都是一样的,但是用的过程碰到一个问题:用第二种方法,传递array做参数的时候,如果其中一个是主键,假设上例中type是主键,之前已经插入过一条mechanical的数据后,在create一个相同type的对象时,我以为应该会报错误,因为type为mechanical的数据已经存在了;然后实际并没有报错……
查看git上源码
public function create(var data = null, var whiteList = null) -> boolean
{
var metaData;
let metaData = this->getModelsMetaData();
/**
* Get the current connection
* If the record already exists we must throw an exception
*/
if this->_exists(metaData, this->getReadConnection()) {
let this->_errorMessages = [
new Message("Record cannot be created because it already exists", null, "InvalidCreateAttempt")
];
return false;
}
/**
* Using save() anyways
*/
return this->save(data, whiteList);
}
判断exists是用metaData,metaData是通过对象的成员变量生成的,而参数的data并没有拿来检查,save中对于已存在的数据就update了,所以解决办法直接写个BaseModel里重写create方法
public function create($data=null, $whiteList=null)
{
if (is_array($data) && count($data) > 0 ){
$this->assign($data, $whiteList);
}
return parent::create();
}