使用CakePHP 3中的其他关联创建具有条件的关联

时间:2016-11-03 11:00:55

标签: cakephp associations conditional-statements cakephp-3.0 has-many

我正在构建一个蛋糕php 3应用程序。我的应用模型包括3个表(以及其他):

  • 结构
  • MeasuringPoints
  • DeviceTypes

每个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的测量点。 但是,先前的关联条件无效;我不知道如何正确实现这一点。

感谢任何帮助。

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

应该注意的是,在这两种情况下你都需要知道这样的结构与级联/依赖删除不兼容,所以不要试图通过这种关联取消链接/删除!

另见