Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用多重查找表的cakephp_Php_Mysql_Cakephp - Fatal编程技术网

使用多重查找表的cakephp

使用多重查找表的cakephp,php,mysql,cakephp,Php,Mysql,Cakephp,全部 我一直在学习php,并建立了一个简单的网站来跟踪车辆故障和维修,但现在我正试图将其转移到cakephp框架,以使其更易于使用。我的问题是我有4张桌子 故障与修复 车辆清单 症状清单 故障代码列表 每次维修可以有3辆车辆、3个症状和3个与之相关的代码,因此我有一个查找表将故障/维修id链接到症状、代码和车辆 我已设置了车辆的基本代码、症状和故障代码模型,如下所示: public $hasAndBelongsToMany = array( 'Fault' =>

全部 我一直在学习php,并建立了一个简单的网站来跟踪车辆故障和维修,但现在我正试图将其转移到cakephp框架,以使其更易于使用。我的问题是我有4张桌子

  • 故障与修复
  • 车辆清单
  • 症状清单
  • 故障代码列表
  • 每次维修可以有3辆车辆、3个症状和3个与之相关的代码,因此我有一个查找表将故障/维修id链接到症状、代码和车辆

    我已设置了车辆的基本代码、症状和故障代码模型,如下所示:

     public $hasAndBelongsToMany = array(
            'Fault' =>
                array(
                    'className' => 'Fault',
                    'joinTable' => 'Faults_vehicles',
                    'foreignKey' => 'vehicle_id',
                    'associationForeignKey' => 'fault_id'
                    )  
        );
    
    这让我可以用给定的车辆ID在故障表中搜索任何故障,这很好。我的问题是如何设置它,以便使用给定的车辆ID和具有匹配故障代码ID的给定症状ID在故障表中搜索故障

    我对php非常陌生,刚刚开始使用cakephp,如果这毫无意义,请提前表示歉意

    谢谢你的时间


    j

    出于两个原因,您需要手动进行连接(请参阅),而不是依赖CakePHP的可包含或递归功能:

  • CakePHP的默认行为是,HABTM关联的模型的数据将通过一个独立于“父”模型的查询从数据库中获取。这意味着,如果您试图向查询中添加一个条件,该条件涉及HABTM关联的模型中的一个列,那么您将得到一个关于该列在查询中不存在的错误

  • 当留给自己的设备时,CakePHP总是使用左连接。您需要使用内部联接来执行所需的操作

  • 我认为您的发现应该是这样的,尽管我在猜测您的表的名称,它们的模式如何,等等

    $this->Fault->recursive = -1;
    $this->Fault->find('all', array(
        'contain' => array('Code'),
        'joins' => array(
              array(
                  'table' => '(SELECT * FROM vehicles LEFT JOIN 
                         faults_vehicles ON faults_vehicles.vehicle_id = vehicles.id)'
                  'alias' => 'Vehicle',
                  'type' => 'inner',
                  'conditions' => array(
                       'Vehicle.fault_id = Fault.id',
                       'Vehicle.code' => $vehicleCode,
                  ),
              ),
              array(
                  'table' => '(SELECT * FROM symptoms LEFT JOIN 
                         faults_symptoms ON faults_symptoms.symptom_id = symptoms.id)'
                  'alias' => 'Symptom',
                  'type' => 'inner',
                  'conditions' => array(
                       'Symptom.fault_id = Fault.id',
                       'Symptom.code' => $symptomCode,
                  ),
              ),
              array(
                  'table' => '(SELECT * FROM codes LEFT JOIN 
                         faults_codes ON faults_codes.code_id = codes.id)'
                  'alias' => 'Code',
                  'type' => 'inner',
                  'conditions' => array(
                       'Code.fault_id = Fault.id',
                       'Code.code' => $faultCode,
                  ),
              ),
         ),
    ));
    

    非常感谢你,我已经试着解决这个问题一段时间了。我对其进行了一些更改,并添加了一些if语句,以便在未选择车辆或症状时搜索所有故障。这段代码是有效的,但我不想知道我是否可以做得更好或以更好的方式做

    在我的控制器中,我这样称呼模型

    $this->set('searchResults',ClassRegistry::init('fault')->getSearchResults($vehicle,$dtc,$symptom))

    然后我的模型是:

    function getSearchResults($vehicle, $dtc, $symptom) {
    
        $VehicleSearch = null;
    
        $DtcSearch = null;
        $SymptomSearch = null;
    
        if($symptom != 'ALL'){
            $SymptomSearch = array(
              'table' => '(SELECT * FROM symptoms LEFT JOIN 
                     faults_symptoms ON faults_symptoms.symptom_id = symptoms.id)',
              'alias' => 'Symptom',
              'type' => 'inner',
              'conditions' => array(
    
                   'Symptom.fault_id = Fault.id',
                  'Symptom.symptom_id' => $symptom,
              ),
          );
        }
    
    
        if($vehicle != 'ALL'){
            $VehicleSearch = array(
              'table' => '(SELECT * FROM vehicles LEFT JOIN 
                     faults_vehicles ON faults_vehicles.vehicle_id = vehicles.id)',
              'alias' => 'Vehicle',
              'type' => 'inner',
              'conditions' => array(
    
                   'Vehicle.fault_id = Fault.id',
                  'Vehicle.vehicle_id' => $vehicle,
              ),
          );
        }
    
    
        if($dtc != 'ALL'){
            $DtcSearch = array(
              'table' => '(SELECT * FROM dtcs LEFT JOIN 
                     faults_dtcs ON faults_dtcs.dtc_id = dtcs.id)',
              'alias' => 'Dtc',
              'type' => 'inner',
              'conditions' => array(
    
                  'Dtc.fault_id = fault.id',
                  'Dtc.dtc_id' => $dtc,
              ),
          );
        }
    
    $this->recursive = -1;
    $Results = $this->find('all', array(
    'conditions' => array(),
    
    'joins' => array(
    
        $VehicleSearch,$DtcSearch,$SymptomSearch
          ,       
     ),           
     ));         
    return $Results; 
    }
    
    非常感谢大家的帮助

    杰森