2016-11-03 34 views
0

私はケーキのPHP 3アプリを構築しています。CakePHP 3で他の関連付けを使用した条件との関連付けを作成する

  • 構造
  • MeasuringPoints
  • DeviceTypes各Strcutureが複数MeasuringPoints有することができる

// StrcuturesTable.php 
... 
public function initialize(array $config) 
{ 
    parent::initialize($config); 

    ... 

    $this->hasMany('MeasuringPoints', [ 
     'foreignKey' => 'structure_id' 
    ]); 
} 

また、各マイアプリモデルは、3つの(とりわけ)テーブルを含みます測定ポイントは特定のデバイスタイプです:

// 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 しかしIDを持っている、唯一のそれらの測定点が欲しい、以前の関連付けの条件が有効ではありません。私はこれを正しく実装する方法を知りません。

何か助けていただければ幸いです。

答えて

0

正解ですが、その条件は無効です。理由はいくつかあります。最初にすべてのパスはサポートされていません。たとえそうであったとしても、すでにMeasuringPoints、それぞれSpecialMeasuringPointsになっていますので、再度指定する必要はありません。

のような状態合格することは可能であろうが:SpecialMeasuringPointsを取得するときDeviceTypesを含まalawysに必要となる

'DeviceTypes.id' => 1 

を。

私はファインダーを使用することをお勧めします。この方法で、DeviceTypesを簡単に含めることができます。あなたのMeasuringPointsクラスで

$this->hasMany('SpecialMeasuringPoints',[ 
    'className' => 'MeasuringPoints', 
    'foreignKey' => 'structure_id', 
    'finder' => 'specialMeasuringPoints' 
]); 

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

どちらの場合も、次の点に注意する必要があります。 uch構造体はカスケード/依存型削除と互換性がないので、そのような関連付けを介してリンクを解除/削除しないでください!

も参照してください

+0

この包括的な答えをいただき、ありがとうございます。現在、私はこれの回避策を実装しましたが、私は間違いなくカスタムファインダーで試してみます! –

関連する問題