0

我需要将医院分配到一个组中。我决定通过 habtm 做到这一点。

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 个。所以我将关联设置为 false,因为默认行为只是删除关联。我决定首先测试使用方法添加医院的能力......

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

现在,上面正确地添加了关联,这很棒,但是每次我试图找到一种方法来计算现有关联的数量时,我都会碰壁。

上面还有一个次要问题,那就是它也允许重复。

4

1 回答 1

0

我想出了一个非常非 cake-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,或者至少让它更安全?

编辑通过使用数据源对象使其卫生,虽然我仍然觉得这个答案不是最好的答案......

于 2014-01-05T01:30:49.177 回答