所有 我一直在学习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搜索Faults表中的故障。
我是php的新手,刚开始使用cakephp,如果这根本没有意义,请提前抱歉。
感谢您的时间
Ĵ
答案 0 :(得分:0)
您需要手动进行连接(请参阅http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#joining-tables),而不是依赖CakePHP的可包含或递归功能,原因有两个:
CakePHP的默认行为是针对HABTM关联的模型的数据,将通过单独的查询从数据库中获取" parent"模型。这意味着如果您尝试向查询中添加涉及HABTM关联的模型中的列的条件,则会在查询中出现关于该列的错误。
当留给自己的设备时,CakePHP总是使用LEFT连接。您将需要使用INNER联接来执行您想要的操作。
我认为你的发现看起来应该是这样的,虽然我猜你的表名是什么,他们的模式是什么样的,等等。
$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;
}
非常感谢大家的帮助。
杰森