我有一个Post与 具有多对多关系的模型Tags。
在 Post 模型中定义:
\n\npublic function getTags(){\n return $this->hasMany(Tags::className(), ['id' => 'tag_id'])\n ->viaTable('post_tags', ['post_id' => 'id']);\n}\nRun 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
控制器使用 load 来设置所有属性:
\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n视图中的输入字段:
\n\n<?= $form->field($model, 'tags')->textInput(['value'=>$model->stringTags()]) ?>\nRun Code Online (Sandbox Code Playgroud)\n\n为什么是Post::tags只读的?设置模型关系的正确方法是什么?
这里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)
| 归档时间: |
|
| 查看次数: |
19080 次 |
| 最近记录: |