Hi,
Finally I could find a way to insert data into the database through many to many relations. Here I'm considering a small example. There are three tables in my database (Student, Course and StudentCourseAssignments). I'm pasting my code and if you have any easier ways to do this, please let us know.
In my Student model,
<?php
class Student extends CActiveRecord
{
public $courseNames; // I used this variable to get inputs from the view in text. I'm taking this input as coma separated course names.
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return 'student';
}
public function rules()
{
return array(
array('age', 'numerical', 'integerOnly'=>true),
array('name', 'length', 'max'=>45),
array('courseNames','match', 'pattern'=>'/^[\w\s,]+$/', 'message'=>'Course name should be a string'),
// The following rule is used by search().
// Please remove those attributes that should not be searched.
array('id, name, age', 'safe', 'on'=>'search'),
);
}
public function afterSave(){
parent::afterSave();
Course::updateCourses($this->courseNames, $this->id);
}
public function relations()
{
return array(
'courses' => array(self::MANY_MANY, 'Course', 'coursestudentassignment(studentId, courseId)'),
);
}
public function attributeLabels()
{
return array(
'id' => 'ID',
'name' => 'Name',
'age' => 'Age',
'courseNames' => 'Courses',
);
}
public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('name',$this->name,true);
$criteria->compare('age',$this->age);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
}
In my Course model,
<?php
class Course extends CActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public static function isExistCourse($courseName){
$course = self::model()->find('LOWER(name)=?', array($courseName));
return !($course===null);
}
public static function updateCourses($coursesString, $studentId){
$explodedCourses = explode(",", $coursesString);
foreach($explodedCourses as $singleCouse){
$singleCouse = trim($singleCouse);
if($singleCouse==="")
continue;
if(!(Course::isExistCourse(strtolower($singleCouse)))){
$course = new Course;
$course->attributes = array('name'=>$singleCouse);
if($course->save()){
Coursestudentassignment::updateAssignments($studentId, $course->id);
} else
continue;
}
}
}
public function tableName()
{
return 'course';
}
public function rules()
{
return array(
array('duration', 'numerical'),
array('name', 'length', 'max'=>45),
array('id, name, duration', 'safe', 'on'=>'search'),
);
}
public function relations()
{
return array(
'students' => array(self::MANY_MANY, 'Student', 'coursestudentassignment(courseId, studentId)'),
);
}
public function attributeLabels()
{
return array(
'id' => 'ID',
'name' => 'Name',
'duration' => 'Duration',
);
}
public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('id',$this->id);
$criteria->compare('name',$this->name,true);
$criteria->compare('duration',$this->duration);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
}
In my Coursestudentassignment model,
<?php
class Coursestudentassignment extends CActiveRecord
{
public static function model($className=__CLASS__)
{
return parent::model($className);
}
public static function updateAssignments($studentId, $courseId){
$criteria=new CDbCriteria;
$criteria->condition='studentId=:studentId and courseId=:courseId';
$criteria->params=array(':studentId'=>$studentId, ':courseId'=>$courseId);
$assignment = self::model()->find($criteria);
if($assignment===null) {
$assignment = new Coursestudentassignment;
$assignment->attributes = array('studentId'=>$studentId,
'courseId'=>$courseId);
$assignment->save();
}
}
public function tableName()
{
return 'coursestudentassignment';
}
public function rules()
{
return array(
array('studentId, courseId', 'required'),
array('studentId, courseId', 'numerical', 'integerOnly'=>true),
array('studentId, courseId', 'safe', 'on'=>'search'),
);
}
public function attributeLabels()
{
return array(
'studentId' => 'Student',
'courseId' => 'Course',
);
}
public function search()
{
$criteria=new CDbCriteria;
$criteria->compare('studentId',$this->studentId);
$criteria->compare('courseId',$this->courseId);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
}
And in the _form.php in views I added a text field to collect courses names.
.......
<div class="row">
<?php echo $form->labelEx($model,'courseNames'); ?>
<?php echo $form->textField($model,'courseNames'); ?>
<?php echo $form->error($model,'courseNames'); ?>
</div>
.......
And I'm attaching my files here also. I've tested this code and worked fine.
Thanx guys.