具有不存在的列名称的Phalcon更新模型始终返回成功

时间:2014-02-21 10:05:00

标签: model transactions phalcon

这是一个模型

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",只有更新有此问题.....

让我很烦恼。因为在事务中,如果有人编写错误的列名,它就不会回滚........

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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不存在就会抛出异常。