【问题标题】:Counting Current HABTM Relationships. CakePHP计算当前的 HABTM 关系。 CakePHP
【发布时间】:2014-01-05 01:12:24
【问题描述】:

我需要将医院分配到一个组中。我决定通过 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;
}

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

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

【问题讨论】:

    标签: cakephp has-and-belongs-to-many cakephp-2.4


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多