假设我有一张桌子'帐户'以下结构
CREATE TABLE IF NOT EXISTS `account` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Id',
`name` varchar(255) NOT NULL COMMENT 'Name',
`index` int(11) NOT NULL COMMENT 'Index',
`user_id` int(11) NOT NULL COMMENT 'UserID',
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`)
)
我创建了一个模型' Account'使用gii。
当我尝试创建新帐户时,我希望从会话
分配user_id
所以,在控制器中,我尝试过如下。
$model = new Account();
$model->**setUser_Id**(Yii::$app->user->getID());
if ($model->load(Yii::$app->request->post()) && $model->save())
但是,我不会在Account模型中编写任何setUser_Id
方法,因为我假设在调用set方法时,它会自动分配ActiveRecord的属性。
但它的投掷错误。但是当我尝试
时它工作正常$model->user_id = Yii::$app->user->getID();
根据文件http://www.yiiframework.com/wiki/167/understanding-virtual-attributes-and-get-set-methods/, 请注意,get / set函数可以直接作为函数调用(但需要通常的函数调用括号):
$x = $model->fullname;
$x = $model->getFullname(); // same thing
$model->active = 1;
$model->setActive(1); // same thing
请问专家对此有所了解吗?
答案 0 :(得分:0)
[编辑]更好地阅读问题,并做了一些澄清,以使答案更全面。
实际上是预期的例外。
在Yii中实现整个虚拟属性功能的方式表明,在调用$model->attribute
时,魔术方法__get()
和__set()
会在表列中搜索属性名称,如果不,分别搜索您可能实现的getter或setter。 (这非常近似,但应该给你一个想法,通过查看代码可以看到更多信息:https://github.com/yiisoft/yii2/blob/master/framework/db/BaseActiveRecord.php#L237)
这意味着虚拟属性本身只能以一种方式工作。否则,您始终可以使用$model->getAttribute('my_attribute');
和$model->setAttribute('my_attribute', $value);
您从发布的链接中获取的示例是脱离上下文(除了为Yii 1编写):在那里,您可以手动实现getter / setter,然后以两种方式调用。
名称可能与数据库中的内容不一致的唯一情况是表名包含下划线,在这种情况下,它们将被删除:例如people_manager
变为PeopleManager
作为模型的类名。
它无论如何都不清楚你想要达到的目标,这可能会帮助我们更好地指导你如何达到你想要的目标。
答案 1 :(得分:0)
它抛出一个异常是正确的,因为你没有写过任何setter或getter。 yii实现中的ActiveRecord使用虚拟属性(通过__get()/ __ set()魔术函数实现),可以像$ model->属性和$ model-> attribute = $ value一样访问。 您不能使用$ model-> getAttribute()或$ model-> setAttribute($ value),直到您自己实现它们。
答案 2 :(得分:0)
您的问题是因为PHP对用户定义的标识符区分大小写。当您使用$model->user_id
时,您应该拨打$model->setUser_id
而不是$model->setUser_Id
或$model->setUserId
等等。我的意思是,只有设置后的第一个字母是大写,其余的是字段名称。如果这个答案解决了你的问题,请现在让我。