【问题标题】:Phalcon update model with nonexist colum name always return success列名不存在的 Phalcon 更新模型总是返回成功
【发布时间】:2014-02-21 10:05:00
【问题描述】:

这是一个模型

class Test1 extends \Phalcon\Mvc\Model{

/**
 * @var integer
 */
public $sn;

/**
 *
 * @var string
 */
public $name;

和控制器

$t1 = Test1::findFirst(1);
$t1->wrongName = 'column name not exist';

if ($t1->save() == false) {
echo "Umh, We can't store robots right now: \n";
foreach ($acg->getMessages() as $message) {
    echo $message, "\n";
}
} else {
    echo "Great, a new robot was saved successfully!";
}

$t1->wrongName 不是存在的列名,但$t1->save() 总是返回 true;

如果我新建一个Test1 data and save(),它会检查属性名并返回"name is required",只有更新才有这个问题.....

这让我很困扰。因为在事务中,如果有人编码错误的列名,它不会回滚........

是否有任何配置可以使这个检查更严格?

谢谢!

【问题讨论】:

    标签: model transactions phalcon


    【解决方案1】:

    您可以按如下方式扩展基本模型:

    class BaseModel extends \Phalcon\Mvc\Model{
    {
        private $fields    = [];
    
        public function __call($function, $arguments)
        {
            /**
             * getSocialSecurity becomes SocialSecurity
             */
            $metaFunction = substr($function, 3);
            $field        = array_search($metaFunction, $this->fields);
    
            if (FALSE !== $field) {
    
                $prefix = substr($function, 0, 3);
    
                switch ($prefix) {
                    case 'get':
    
                        return $this->getField($field);
                        break;
    
                    case 'set':
    
                        $this->setField($field, $arguments);
                        break;
                }
    
            } else {
                throw new \Exception('Function does not exist');
            }
        }
    
    
        protected function getField($field)
        {
            return $this->$field;
    
        }
    
        protected function setField($field, $value)
        {
            $this->$field = $value;
        }
    
    }
    

    $fields 变量包含模型中的字段和函数关系,以使 getter 和 setter 起作用。因此,在下面的示例中,getSocialSecurity 将返回 $this->sn 等。

    class Test1 extends BaseModel
    {
        public function initialize()
        {
            parent::initialize();
    
            $this->fields['name'] = 'Name';
            $this->fields['sn']   = 'SocialSecurity';
        }
    }
    

    如果您将所有模型及其相关元数据设置在 $fields 数组中,您将避免您描述的拼写错误问题,因为一旦 getter/setter 不存在就会引发异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      • 2014-10-19
      • 2019-01-19
      • 2021-11-25
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多