【问题标题】:OctoberCMS - Update a field in a related table when insertingOctoberCMS - 插入时更新相关表中的字段
【发布时间】:2018-05-08 20:19:57
【问题描述】:

在 OctoberCMS 中,我有三个表:
学生、课程和订阅(学生 ID、课程 ID、活动)
当学生订阅课程时,在管理员激活它之前它不会被激活。这是合乎逻辑的。但是当管理员从后端打开一个课程表时,他可以选择学生订阅这个课程,然后他们被添加到订阅表中。在这里我想更新字段:自动激活。
我怎样才能做到这一点?
我写了这段代码,但是没有用:

    public function afterSave()
    {
        foreach($this->students as $student)
        {
            $student->pivot->is_activated = true;
            $student->pivot->save;
        }
    }

编辑:

这是我在@Hardik Satasiya 建议之后的所有代码:

    class Course extends Model
    {
      public $belongsToMany = [
        'students'=>[
                'Sunsoft\Courses\Models\Student', 
                'table'=>'sunsoft_courses_student_course', 
                'order'=>'users.name', 
                'scope'=>'students',
                'timestamps' => true,
                'pivot'=>['id', 'is_activated'],
                'pivotModel'=>'Sunsoft\Courses\Models\StudentCourse',
        ],
      ];

      public function afterSave()
      {
        foreach($this->students as $student)
        {
            $student->pivot->is_activated = true;
            $student->pivot->save;
            $student->save;
        }
      }
    }

    class Student extends User
    {
      public $belongsToMany = [
        'courses'=>[
            'sunsoft\courses\models\Course', 
            'table'=>'sunsoft_courses_student_course', 
            'order'=>'sunsoft_courses_courses.name',
            'pivot'=>['id', 'is_activated'],
            'timestamps' => true,
            'pivotModel'=>'Sunsoft\Courses\Models\StudentCourse',
        ],
      ];
     }

     class StudentCourse extends Model
     {
        public $belongsTo= [
          'course'=>['sunsoft\courses\models\Course'],
          'student'=>['sunsoft\courses\models\Student', 'scope'=>'students', 'order'=>'users.name'],
        ];      
    }

这是我得到的错误:
http://prntscr.com/jhrfzu

【问题讨论】:

  • 您在哪个模型中编写了这段代码?你能用代码显示三个表之间的关系吗?

标签: octobercms octobercms-backend october-form-controller


【解决方案1】:

为此,您需要在 Courses 模型中定义适当的关系

定义Pivot Model => Subscriptions 你已经做到了。

现在在Courses 中定义正确的关系。型号

public $belongsToMany = [
    ....
    'students_pivot_model' => [
        'HardikSatasiya\Plugin\Models\Students', // replace model
        'table' => 'yournamespace_course_student', // replace tb name
        'pivot' => ['is_activated'],
        'timestamps' => true, // if you added times-stamp support
        'pivotModel' => 'HardikSatasiya\Plugin\Models\Subscriptions',
    ],
    ....
];

现在手动设置is_activated

public function afterSave()
{
    foreach($this->students_pivot_model as $pivot_model)
    {
        $pivot_model->pivot->is_activated = true;
        // no validations
        $pivot_model->pivot->forceSave(); 
    }
}

这应该可以。如有任何疑问,请发表评论。

【讨论】:

  • 我写了这段代码: public $belongsToMany = [ 'students'=>[ 'sunsoft\courses\models\Student', 'table'=>'sunsoft_courses_student_course', 'order'=>'users .name', 'scope'=>'students', 'timestamps' => true, 'pivot'=>['id', 'is_activated'], 'pivotModel'=>'Sunsoft\Courses\Models\StudentCourse', ], ];但我收到错误:类型错误:传递给 October\Rain\Database\Model::__construct() 的参数 1 必须是数组类型,给定对象
  • 'students'=>[ 'sunsoft\courses\models\Student' 命名空间不正确,第一个字母可能是大写字母。
  • 我将其更改为:'pivotModel'=>'Sunsoft\Courses\Models\StudentCourse',但出现同样的错误,当我删除此行时它可以工作!
  • 如果可能的话,你能分享模型的所有关系和完整的错误页面截图
  • 您好,我已将其添加为我的问题的编辑。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多