HABTM form validation in CakePHP

前端 未结 7 1368
我在风中等你
我在风中等你 2020-12-03 06:33

I have a Projects table and a Users table which are linked by a HABTM relation. In the \"add\" new Project page I have a multiple checkbox section to select Users for the ne

7条回答
  •  既然无缘
    2020-12-03 07:01

    I stumbled on the same issue, but now - 3 years later - with CakePHP 2.3.

    To be clear; Group has and belongs to User. I've had a form like this:

    // View/Groups/add.ctp
    echo $this->Form->input('name');
    echo $this->Form->input('User');
    

    With the validation rule like in user448164's answer:

    // Model/Group.php
    public $validate = array(
        'User' => array(
            'rule' => array('multiple', array('min' => 1)),
            'message' => 'Please select one or more users'
        )
    );
    

    That didn't work, after Googling for it, I found this question which couldn't still be the best solution. Then I tried several things, and discovered this to work just fine:

    // View/Groups/add.ctp
    echo $this->Form->input('name');
    echo $this->Form->input('Group.User');
    

    Way too easy solution, but had to dig into it to find out it works this way.

    Hopefully it helps somebody one day.

    Update for CakePHP 2.4.x (possibly 2.3.x as well)

    When I wrote this answer, I was using CakePHP 2.3.x. Back then it worked perfectly for both validating and saving the data. Now when applying the same code on a new project, using CakePHP 2.4.x, it didn't work anymore.

    I created a test case, using the following code:

    $data = array(
        'User' => array(
            'Client' => array(8)
        ),
    );
    $this->User->create();
    $this->User->saveAll($data);
    

    My first thought was: Saving all means saving all "root" models, what actually makes sense to me. To save deeper than just the "root" ones, you'll have to add the deep option. So I ended up with the following code:

    $data = array(
        'User' => array(
            'Client' => array(8)
        ),
    );
    $this->User->create();
    $this->User->saveAll($data, array('deep' => true));
    

    Works like a charm! Happy coding. :)

    Update (2014/03/06)

    Struggling with the same problem again, in this case with hasMany instead of habtm. Seems like it behaves the same way. But I found myself looking for this answer again, and got confused.

    I'd like to make clear that it's key to use Group.User instead of User in your input. Else it won't use the User model validation.

提交回复
热议问题