user3873381
user3873381

Reputation: 55

Saving data with 2 HABTM and one hasMany association

I am trying to save data with multiple HABTM & hasMany relation. Even if I use

$this->Project->save();

$this->Project->saveMany();

$this->Project->saveAssociated();

$this->Project->saveAlll();

It does not save associated model, I can't figure out what I am doing wrong.

Models Reations

  1. Project hasAndBelongsToMany Skill
  2. Project hasMany Milestone
  3. Project hasAndBelongsToMany Attachment (because Milestone's will also have attachement so can not bind project & attachment in hasMany Relation)

Project Model

class Project extends AppModel{

    public $belongsTo = array('Profile');

    public $hasMany = array('Milestone');

    public $hasAndBelongsToMany = array(
        'Skill' =>
        array(
            'className' => 'Skill',
            'joinTable' => 'projects_skills',
            'foreignKey' => 'project_id',
            'associationForeignKey' => 'skill_id',
            'dependent' => true,
            //'conditions' => array('Advertisement.advertisement_is_active' => '1')
        ),
        'Attachment' =>
        array(
            'className' => 'Attachment',
            'joinTable' => 'attachments_projects',
            'foreignKey' => 'project_id',
            'associationForeignKey' => 'attachment_id',
        )
    );

    public function beforeSave($options = array()) {
        parent::beforeSave($options = array());
            foreach (array_keys($this->hasAndBelongsToMany) as $model):
                if(isset($this->data[$this->alias][$model])):
                    $this->data[$model][$model] = $this->data[$this->alias][$model];
                    unset($this->data[$this->alias][$model]);
                endif;
            endforeach;
        return true;
    }
}  

Skill Model

class Skill extends AppModel {

    public $name = 'Skill';
    public $hasOne = array('Exam');
    public $hasAndBelongsToMany = array(
        'Category' =>
        array(
            'className' => 'Category',
            'joinTable' => 'categories_skills',
            'foreignKey' => 'skill_id',
            'associationForeignKey' => 'category_id',
            'dependent' => true
        ),
        'Profile' =>
        array(
            'className' => 'Profile',
            'joinTable' => 'profiles_skills',
            'foreignKey' => 'skill_id',
            'associationForeignKey' => 'profile_id',
            'dependent' => true
        ),
        'Project' =>
        array(
            'className' => 'Project',
            'joinTable' => 'projects_skills',
            'foreignKey' => 'skill_id',
            'associationForeignKey' => 'project_id',
            //'dependent' => true
        )
    );

}

Attachment Model

class Attachment extends AppModel{

    public $name = 'Attachment';

    public $hasAndBelongsToMany = array(
        'Project' =>
        array(
            'className' => 'Project',
            'joinTable' => 'attachments_projects',
            'foreignKey' => 'attachment_id',
            'associationForeignKey' => 'project_id',
            'dependent' => true,
        )
    );

}

Data

Array
(
    [Project] => Array
        (
            [project_name] => Name Of Project
            [project_detail] => Dummy short description
            [project_category_id] => 3
            [project_budget] => 45
            [Skill] => Array
                (
                    [0] => Array
                        (
                            [skill_id] => 14
                        )

                    [1] => Array
                        (
                            [skill_id] => 16
                        )

                )

            [project_status] => 1
            [project_created] => 2014-08-04 15:31:00
            [creator_id] => 1
        )

    [Milestone] => Array
        (
            [milestone_name] => Milestone 1
            [milestone_budget] => 45
            [milestone_created_on] => 2014-08-04 15:31:00
            [project_id] => 8
        )

    [Attachment] => Array
        (
            [attachment_path] => 11615297103.zip
            [attachment_term] => Project Attachment
            [attachment_type] => zip
            [project_id] => 8
        )

)

Upvotes: 2

Views: 220

Answers (1)

karmicdice
karmicdice

Reputation: 1061

Pass Skill id not the field name of relation model

[Skill] => Array
                (
                    [0] => Array
                        (
                            [id] => 14
                        )

                    [1] => Array
                        (
                            [id] => 16
                        )

                )

Upvotes: 3

Related Questions