cakephp使用乘法查找表

时间:2014-06-02 18:25:18

标签: php mysql cakephp

所有 我一直在学习PHP并且已经组建了一个简单的站点来跟踪车辆故障和维修,但现在我正在尝试将其转移到cakephp框架以使其更容易使用。我的问题是我有4张桌子,

  1. 故障和修复
  2. 车辆清单
  3. 症状列表
  4. 故障代码列表。
  5. 每次修理可以有3辆车,3种症状和3个与之相关的代码,所以我有查询表将故障/维修ID与症状,代码和车辆联系起来。

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

     public $hasAndBelongsToMany = array(
            'Fault' =>
                array(
                    'className' => 'Fault',
                    'joinTable' => 'Faults_vehicles',
                    'foreignKey' => 'vehicle_id',
                    'associationForeignKey' => 'fault_id'
                    )  
        );
    

    这让我可以用给定的车辆ID搜索故障表中的任何故障,这样可以正常工作。我的问题是如何设置它以便我可以使用给定的车辆ID和具有匹配的故障代码ID的给定症状ID搜索Faults表中的故障。

    我是php的新手,刚开始使用cakephp,如果这根本没有意义,请提前抱歉。

    感谢您的时间

    Ĵ

2 个答案:

答案 0 :(得分:0)

您需要手动进行连接(请参阅http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#joining-tables),而不是依赖CakePHP的可包含或递归功能,原因有两个:

  1. CakePHP的默认行为是针对HABTM关联的模型的数据,将通过单独的查询从数据库中获取" parent"模型。这意味着如果您尝试向查询中添加涉及HABTM关联的模型中的列的条件,则会在查询中出现关于该列的错误。

  2. 当留给自己的设备时,CakePHP总是使用LEFT连接。您将需要使用INNER联接来执行您想要的操作。

  3. 我认为你的发现看起来应该是这样的,虽然我猜你的表名是什么,他们的模式是什么样的,等等。

    $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,
                  ),
              ),
         ),
    ));
    

答案 1 :(得分:0)

非常感谢你,我一直试图解决这个问题一段时间了。我已经改变了一点并添加了一些if语句,因此如果没有选择车辆或症状,我可以搜索所有故障。这段代码可以工作,但我不想,如果我能做得更好或以更好的方式做到这一点。

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

$ this-&gt; set(&#39; searchResults&#39;,ClassRegistry :: init(&#39; fault&#39;) - &gt; getSearchResults($ vehicle,$ dtc,$ symptom)); < / p>

然后我的故障模型是:

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; 
}

非常感谢大家的帮助。

杰森