phalcon两种create方法的区别

今天又碰到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();
  }


你可能感兴趣的:(PHP,create,phalcon)