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();
  }


转载于:https://my.oschina.net/u/2244980/blog/531095

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值