Yii2 无效调用:设置只读属性

Dan*_*Dan 6 php yii yii2

我有一个Post与 具有多对多关系的模型Tags

\n\n

在 Post 模型中定义:

\n\n
public function getTags(){\n    return $this->hasMany(Tags::className(), ['id' => 'tag_id'])\n        ->viaTable('post_tags', ['post_id' => 'id']);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是Post::tags只读的。因此,当我尝试在控制器中设置它们时,出现错误:

\n\n
\n

无效调用 \xe2\x80\x93 yii\\base\\InvalidCallException

\n\n

设置只读属性:app\\models\\Post::tags

\n
\n\n

控制器使用 load 来设置所有属性:

\n\n
public function actionCreate(){\n    $P = new Post();\n    if( Yii::$app->request->post() ){\n        $P->load(Yii::$app->request->post());\n        $P->save();\n        return $this->redirect('/posts');\n    }\n    return $this->render('create', ['model'=>$P]);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

视图中的输入字段:

\n\n
<?= $form->field($model, 'tags')->textInput(['value'=>$model->stringTags()]) ?>\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么是Post::tags只读的?设置模型关系的正确方法是什么?

\n

Soh*_*edM 6

这里tags

public function getTags(){
    return $this->hasMany(Tags::className(), ['id' => 'tag_id'])
        ->viaTable('post_tags', ['post_id' => 'id']);
}
Run Code Online (Sandbox Code Playgroud)

是一个关系名称并返回对象,而不仅仅是属性或数据库列。

您不能将它与textInput()其他属性一起使用,例如email, first_name

所以你得到的错误是Setting read-only property.

为了消除此错误,您需要创建新的属性或属性来建模,如下所示

class Post extends \yii\db\ActiveRecordsd
{
    public $tg;
    public function rules()
    {
        return [
            // ...
            ['tg', 'string', 'required'],
        ];
    }
    // ... 
Run Code Online (Sandbox Code Playgroud)

在查看文件中

<?= $form->field($model, 'tg')->textInput(['value'=>$model->stringTags()]) ?>
Run Code Online (Sandbox Code Playgroud)