我正在构建一个蛋糕php 3应用程序。我的应用模型包括3个表(以及其他):
每个Strcuture可以有多个MeasuringPoints:
// StrcuturesTable.php
...
public function initialize(array $config)
{
parent::initialize($config);
...
$this->hasMany('MeasuringPoints', [
'foreignKey' => 'structure_id'
]);
}
此外,每个测量点都属于某种设备类型:
// MeasuringPointsTable.php
...
public function initialize(array $config)
{
parent::initialize($config);
...
$this->belongsTo('DeviceTypes', [
'foreignKey' => 'device_type_id',
'joinType' => 'INNER'
]);
}
我所期待的是如何创建一个特殊的测量点'结构表中的关联。
有点像:
// MeasuringPointsTable.php
...
$this->hasMany('SpecialMeasuringPoints',[
'className' => 'MeasuringPoints',
'foreignKey' => 'structure_id',
'conditions' => ['MeasuringPoints.DeviceTypes.id'=>1]
]);
正如您所看到的,我只想要那些相关设备类型具有id 1的测量点。 但是,先前的关联条件无效;我不知道如何正确实现这一点。
感谢任何帮助。
答案 0 :(得分:1)
正确,由于多种原因,该条件无效。首先不支持所有路径,即使它们已经存在,您已经分别在MeasuringPoints
SpecialMeasuringPoints
,因此无需再次指示。
虽然可以通过如下条件:
'DeviceTypes.id' => 1
在检索DeviceTypes
时,这需要alawys包含SpecialMeasuringPoints
。
我建议使用取景器,这样您就可以轻松地包含DeviceTypes
并符合您所需的条件。类似的东西:
$this->hasMany('SpecialMeasuringPoints',[
'className' => 'MeasuringPoints',
'foreignKey' => 'structure_id',
'finder' => 'specialMeasuringPoints'
]);
在MeasuringPoints
课程中定义相应的查找程序,例如使用matching()
,您应该很好:
public function findSpecialMeasuringPoints(\Cake\ORM\Query $query) {
return $query
->matching('DeviceTypes', function (\Cake\ORM\Query $query) {
return $query
->where([
'DeviceTypes.id' => 1
]);
});
}
在传递回调时,可以通过conditions
选项进行类似的操作,但这样做不那么干:
$this->hasMany('SpecialMeasuringPoints',[
'className' => 'MeasuringPoints',
'foreignKey' => 'structure_id',
'conditions' => function (
\Cake\Database\Expression\QueryExpression $exp,
\Cake\ORM\Query $query
) {
$query
->matching('DeviceTypes', function (\Cake\ORM\Query $query) {
return $query
->where([
'DeviceTypes.id' => 1
]);
return $exp;
}
]);
应该注意的是,在这两种情况下你都需要知道这样的结构与级联/依赖删除不兼容,所以不要试图通过这种关联取消链接/删除!
另见