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


Unknown Method – when using set/get method on active record model property Yii2

假设我有一个结构如下的表'帐户'

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`)
)

我使用 gii 为此创建了一个模型"账户"。

当我尝试创建新帐户时,我希望从会话中分配user_id

所以,在控制器中,我像下面一样尝试。

$model = new Account();
$model->**setUser_Id**(Yii::$app->user->getID());
if ($model->load(Yii::$app->request->post()) && $model->save())

但是,我不在帐户模型中编写任何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

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

它抛出一个例外是正确的,因为你没有写过任何二传手或getter。yii 实现中的 ActiveRecord 使用虚拟属性(通过 __get()/__set() 魔术函数实现),可以像 $model->attribute 和 $model->attribute = $value 一样访问。在你自己实现它们之前,你不能使用 $model->getAttribute() 或 $model->setAttribute($value)。

[

编辑]更好地阅读了这个问题,并做了一些澄清以使答案更全面。

异常实际上是意料之中的。

整个虚拟属性功能在 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_managerPeopleManager为模型的类名。

无论如何,您都

不清楚您要实现的目标,这可能有助于我们为您提供有关如何实现所需目标的更好方向。

您的问题是因为 PHP 对用户定义的标识符区分大小写。当你使用$model->user_id时,你应该调用$model->setUser_id而不是$model->setUser_Id$model->setUserId等。我的意思是,只有 set 后的第一个字母是大写字母,其余字母是字段名称。现在让我,如果这个答案解决了你的问题。