2016-11-03 8 views
0

Я создаю приложение для торта php 3. Моя модель приложения включает в себя 3 таблицы (среди прочих):Создание ассоциации с условием использования другой ассоциации в CakePHP 3

  • Структуры
  • MeasuringPoints
  • DeviceTypes

где каждая Страница данных может иметь несколько 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' 
    ]); 
} 

Для чего я ищу, как создать ассоциацию «SpecialMeasuringPoints» в таблице «Структура».

Несколько как:

// MeasuringPointsTable.php 
... 
    $this->hasMany('SpecialMeasuringPoints',[ 
      'className' => 'MeasuringPoints', 
      'foreignKey' => 'structure_id', 
      'conditions' => ['MeasuringPoints.DeviceTypes.id'=>1] 
    ]); 

Как вы можете видеть, я хочу только те точки измерения, чей соответствующий тип устройства имеет идентификатор 1. Однако предыдущее условие объединения не является действительным; и я не знаю, как правильно это реализовать.

Любая помощь приветствуется.

ответ

0

Правильно, это условие недействительно по ряду причин. Прежде всего, пути не поддерживаются вообще, и даже если они были, вы уже находитесь в MeasuringPoints, соответственно SpecialMeasuringPoints, так что не нужно будет указывать это снова.

Хотя можно было бы передать состояние, как:

'DeviceTypes.id' => 1 

Это потребует, чтобы alawys содержать DeviceTypes при получении 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 при прохождении обратного вызова, который, однако, меньше DRY:

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

Следует отметить, что в обоих случаях вам необходимо знать, что s Конструкции uch не совместимы с каскадными/зависимыми удалениями, поэтому не пытайтесь отключать/удалять через такие ассоциации!

Смотрите также

+0

Спасибо за исчерпывающий ответ. В настоящее время я применил обходной путь для этого, но я обязательно попробую его с помощью пользовательского поиска! –