2014-01-05 5 views
0

Мне нужно назначить больницы группе. Я решил сделать это через habtm.Подсчет текущих отношений HABTM. CakePHP

class FavoriteHospital extends AppModel { 
    public $actsAs = array('Containable'); 
    ... 

    var $hasAndBelongsToMany = array(
     'Hospital' => array(
      'className' => 'Hospital', 
      'joinTable' => 'favorite_hospitals_hospital', 
      'foreignKey' => 'favorite_hospital_id', 
      'associationForeignKey' => 'hospital_id', 
      'unique' => false, 
     ) 
    ); 
} 

Существует требование, чтобы ограничить число больниц в группе до 10. Таким образом, я могу установить связь с ложным, потому что поведение по умолчанию просто удаляет ассоциации. Я решил начать с тестированием возможности добавлять в больницу, используя метод ....

public function addHospital($gid, $hid) {       
    $this->data['Hospital']['id'] = $hid; 
    $this->data['FavoriteHospital']['id'] = $gid; 
    if($this->save($this->data)){return true;} 
    return false; 
} 

Теперь, выше добавляет ассоциацию правильно, это здорово, но каждый раз, когда я пытаюсь найти способ, чтобы сосчитать количество существующих ассоциаций, я ударил кирпичную стену.

Существует вторичная проблема с вышеуказанным, и это то, что она также позволяет дублировать.

ответ

0

я понял, очень не-торт-PHP способ сделать это (также позволяет инъекции потенциал SQL):

public function addHospital($gid, $hid) { 
    $db = $this->getDataSource(); 
    //$fh_count = $this->query("SELECT count(favorite_hospital_id) FROM favorite_hospitals_hospital WHERE favorite_hospital_id = ".$gid.";"); 
    $fh_count = $db->fetchAll(
      'SELECT count(favorite_hospital_id) from favorite_hospitals_hospital where favorite_hospital_id = ?', 
      array($gid) 
    ); 
    if($fh_count[0][0]['count(favorite_hospital_id)'] < 10){  
     //$existing_association = $this->query("SELECT count(*) FROM favorite_hospitals_hospital WHERE favorite_hospital_id = ".$gid." AND hospital_id = ".$hid.";"); 
     $existing_association = $db->fetchAll(
         'SELECT count(*) from favorite_hospitals_hospital where favorite_hospital_id = ? and hospital_id = ?', 
         array($gid,$hid) 
     ); 
     if($existing_association[0][0]['count(*)'] < 1){      
      $this->data['Hospital']['id'] = $hid; 
      $this->data['FavoriteHospital']['id'] = $gid; 
      if($this->save($this->data)){return true;} 
     } else { 
      throw new Exception(__('Association already exists in that group')); 
     } 
    } else { 
     throw new Exception(__('Already 10 Hospitals in that group')); 
    } 
    return false; 
} 

Может кто-то улучшить этот ответ? либо сделать его более cakephp, или, по крайней мере, сделать его более безопасным?

EDIT сделал санитарный помощью объекта источника данных, хотя я до сих пор считаю, что это ответ не лучший ответ ...

Смежные вопросы