未知方法 - 在活动记录模型属性Yii2上使用set / get方法时

时间:2014-12-23 09:20:28

标签: php oop yii

假设我有一张桌子'帐户'以下结构

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

请问专家对此有所了解吗?

3 个答案:

答案 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等等。我的意思是,只有设置后的第一个字母是大写,其余的是字段名称。如果这个答案解决了你的问题,请现在让我。