Antony
Antony

Reputation: 33

CakePHP - Correct way to do hasMany through

I have 3 models

Categories:

 class Category extends AppModel {
     public $belongsTo = array(
        'Parent' => array(
            'className' => 'Category',
            'foreignKey' => 'parent_id'
        ),
     );
     public $hasMany = array(
         'Children' => array(
            'className' => 'Category',
            'foreignKey' => 'parent_id'
         ), 
        'UserCategoryMeta'
     );
}

Users:

class User extends AppModel {
    public $hasMany = array(
        'UserCategoryMeta' => array(
            'className' => 'UserCategoryMeta',
            'foreignKey' => 'user_id',
        ),
    );
}

UserCategoryMeta:

class UserCategoryMeta extends AppModel
{
    public $belongsTo = array(
        'User', 'Category'
    );
}

What I need to do is have each user be able to choose many categories and for each of those associations I need the user to set search terms which is just 1 field in the DB.

So the UserCategoryMeta table looks like this:

id  |  user_id  | category_id  |  search_terms

I've found a way which might work but it seems very hacky.

In the usercontroller I have:

$Categories = $this->User->Category->find('list');

Then in the add view I have the checkboxes:

echo $this->Form->input('Category.Category',array(
    'type' => 'select', 
    'multiple' =>'checkbox',
    'options' => $Categories,
));

Then the only way I could get each of those checkboxes to have a search terms input next to them is to do this in the add view:

foreach ($Categories as $key => $category){
    echo '<input type="text" id="Category'.$key.'SearchTerms" name="data[Category][search_terms]['.$key.']"><br/>';
}

This produces what I want but obviously since I'm just creating random inputs when the form get's submitted it get's black holed. I have managed to get passed this but I know I'm doing it the wrong way and hopefully someone can help me do it the right way.

Also then once I have this data array in the controller im not sure how to save it to the database correctly.

Thanks in advance for any help!

Upvotes: 3

Views: 525

Answers (1)

Dave
Dave

Reputation: 29121

Just do what you're doing, but in the repeat, use $this->Form->input instead of just manually writing the HTML.

Upvotes: 3

Related Questions