0

私は CakePHP を初めて使用し、CakePHP アプリケーションを維持/開発する必要があり、モデルの 1 つで BelongsTo を削除するのに苦労しています。

コードは、より多くの関連テーブルを使用する別のプロジェクトからコピーされています。新しいプロジェクトでは、処理を高速化するために本当に削除したいクエリで LEFT JOINS を作成しているため、関係は必要ありません。だから私はモデルに入り、$belongsToプロパティを削除しました..

ホームページにアクセスすると、警告が表示されます:-

Warning (512): Model "Product" is not associated with model "ParentProduct"
 [CORE/Cake/Model/Behavior/ContainableBehavior.php, line 343]

デバッグをオフにすると表示されませんが、このメッセージが生成される理由を知りたいです。関係を削除する方法についての情報が見つかりませんbelongsTo

どんな助けでも感謝します。

4

2 に答える 2

0

だから私はモデルに入り、 $belongsTo プロパティを削除しました

求めてるから

この種のエラーは、containable 動作を誤って使用した場合に表示されます。

たとえば、User hasMany Article と次のコードを考えてみましょう。

$User->find('all', array(
    'contain' => array(
        'Article'
    )
));

これにより、存在する他の関連付けに関係なく、すべてのユーザーとその記事 (のみ) が返されます。

定義されていない関連付けが要求された場合:

$User->find('all', array(
    'contain' => array(
        'Article',
        'Comment'
    )
));

Containable は警告を生成するので、開発者は、入力ミスまたは別の種類の開発エラーを示すコメントが結果にないことを知ることができます (ああ... User<-Article<-Comment です)。

モデルの関連付けは変更されていますが、(明らかに) アプリケーション コードは変更されていないため、これはあなたが説明した内容と一致しています。

于 2013-07-06T08:40:23.440 に答える
0

メッセージが生成されました (おそらく) コントローラー (最初に ParentProductsController を確認してください) が次のようなものであるためです。

$this->ParentProductsController->Product->find();

そのモデルの関連付けは、削除したかったため存在しなくなりました。そのため、ParentProducts が Product を呼び出す方法はありません。そのような呼び出しを次のように変更する必要があります

ClassRegistry::init('the_name_of_the_model');

(この場合ClassRegistry::init('Product');)またはモデルをロードします

$this->loadModel('Product');

これは、現在のコントローラーに関連しないモデルを呼び出す場合にのみ必要です。ProductsController から呼び出している場合Product->find、エラーは発生しません。

わかりました、それがエラーの原因です。
しかし今:関連付けを削除することはお勧めしません。データベースにまだ存在していても、コード内の論理的な関連付けを削除する必要はまったくありません。誰かの手足を切断することなく、左結合とデータベースへの無用なクエリを回避する方法は他にもあります。

スピードアップしたい場合は、Containable Behaviorについて読んで、すべてのモデルを$recursive = -1( recursive doc ) に設定してください。そうすれば、明示的に言わない限り、LEFT JOINS を取得できません。

于 2013-07-05T15:56:24.503 に答える