phpcakephp

isUnique Validation in CakePHP hasMany association


Database Structure

I have two tables, users and nicks. In users table I have a field username and in nicks table I have a field nick_name

There is a hasMany association between users and nicks

    public $hasMany = array(
        'Nick' => array(
            'className' => 'Nick',
            'foreignKey' => 'user_id',
            'dependent' => true
        )

    );

In the User model I am validating to allow only unique username during registration by

            'username must be unique' => array(
                'rule' => 'isUnique',
                'message' => 'username is already taken'

            )

but I also don't want to allow users to register any previously used nick names as their username. for that.

            'somebody use that name as a nickname' => array(
                'rule' => 'checkNickName',
                'message' => 'That name is already in use'
            )

and

    public function checkNickName(){
        $nick2 = $this->find('all');
        $nickNames = array();
        foreach($nick2 as $name2){
            foreach($name2['Nick'] as $name1){
                array_push($nickNames,strtolower($name1['nick_name']));
            }

        }

        $username = strtolower($this->data['User']['username']);
        return in_array($username,$nickNames);

    }

But that's not working. What should I to make it work?


Solution

  • First find the nicknames.

    $nick2 = $this->Nick->find('all');
    

    Then the result array will be

    nick2 = array(
        0    => array(                       //first foreach
            'Nick' => array(
                 nickname => 'TEST'
                 )
             )
         )
    

    so remove the second foreach and save the value as using $name2['Nick']['nickname']

    public function checkNickName(){
        $nick2 = $this->Nick->find('all');
        $nickNames = array();
        foreach($nick2 as $name2){
             array_push($nickNames,strtolower($name2['Nick']['nick_name']));
        }
    
        $username = strtolower($this->data['User']['username']);
        return in_array($username,$nickNames);
    
    }