2016-09-01 3 views
6

以前のバージョンのCakePHPでは、アソシエーションを一時的にTable::bindModel('SomeModel');に変更することができましたが、v3でこれを行う方法を理解できません。CakePHP v3で即座にアソシエーションを削除する方法

テーブルが存在する前に書き込まれた古い移行を実行するとエラーが発生するため、テーブルクラスで定義されているhasManyの関連付けを一時的に無効にしたいとします。私は移行の問題を完全には理解していませんが、Tableクラスの関連付けをコメントアウトするとすぐに消え去ります。

class AgenciesTable extends Table 
{ 
    public function initialize(array $config) 
    { 
     parent::initialize($config); 

     $this->table('agencies'); 
     $this->displayField('full_name'); 
     $this->primaryKey('id'); 
     $this->addBehavior('Timestamp'); 

     $this->hasMany('Routes'); 

enter image description here

+1

これは単なる推測ですが、cake3では実装されていないと思います。理由は、あなたがfind()呼び出しでテーブルを '含む'まで、ケーキが実際に関係を呼び出さないことが原因かもしれません。したがって、Routesを含むfind()呼び出しがない場合、akeはそのテーブルの存在をチェックしません。 – arilia

答えて

1

ここでの問題は、マイグレーションを使用しているときには、実際のモデルクラスに依存すべきではないということです。これはちょうどあなたが直面した問題の種類を引き起こす可能性があります。

代わりにTableRegistryまたはTableオブジェクトを直接使用し、依存関係のないテーブルオブジェクトを作成します。そのオブジェクトに直接必要な関連付けをロードします。

$agencies = new Table(['table' => 'agencies', /*...*/]); 
$agencies->belongsTo('Whatever'); 
/* Do your data manipulation */ 

このようにして、AgenciesTableクラスに何らかの変更が加えられても、移行は機能します。そして、これは移行でそれを行う正しい方法です。

$this->hasMany('Routes');を呼び出すことで明示的な関連付けを作成しなくても、熱心なローダーが一致するテーブルクラスを見つけて動的に読み込もうとするため、同じエラーが発生すると思います。これはまた、「包含しない」方法がない理由でもあります。

実際のクエリコードを表示していません...だから私はと答えています。あなたはAsk :: contains()をどこかで呼び出すカスタム検索またはメソッドを呼び出しています。それを含まない新しいクエリを書くだけですか?あなたは大きなクエリがある場合は

$agencies->find()->contain(['One', 'Two'])->where([/*...*/])->all(); 

より多くのカスタムにそれを破るのは良い考えかもしれません、それらを組み合わせることができるので、検索します。

$agencies->find('withoutMyContain')->all(); 
$agencies->find('withoutMyContain')->find('withMyContain')->all(); 

Custom Finder Methodsを参照してください。

+0

ありがとう!私たちは、マイグレーションを焼くときに得られる定型コードから単純にエラーを出しています。追加の手品はありません。あなたの回避策はうまくいくと思います。しかし、元の問題がバグかどうかは疑問です。非常に一般的な状況のように見えますが、その後、いつの間にかマイグレーションを作成して新しいアソシエーションを導入していきます。 – emersonthis

関連する問題