Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CakePHP - Correct way to do hasMany through

Tags:

php

model

cakephp

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!

like image 378
Antony Avatar asked Feb 06 '26 17:02

Antony


1 Answers

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

like image 172
Dave Avatar answered Feb 09 '26 05:02

Dave