解決:
アプリケーションのドキュメント ルートに Samples.php ファイルがありました。アプリの通常の Yii 実行チェーンでこれが実際にどのように機能したかは、私にはわかりません。しかし、それはありました。私はそれを削除しましたが、今では正常に機能しています。ありがとう!
更新: (私が知っている) すべてのキャッシュが無効になっていることを除けば、これはほぼ確実にアプリ レベルのキャッシュの問題です。製品の Models フォルダに移動してさまざまなモデルを削除すると、Yii はすぐに、これらのモデルが存在しないという予期されたエラーをスローします。Samples モデルではそうではありません。それは周りにとどまります。
Yii Search で非常に奇妙な問題が発生しています。
私がやっていることは、以前に 100 回行ったのと同じように、関連するモデルを検索することです。これは私の開発ホストでは正常に動作しますが、本番ホストに公開するとすぐに失敗します: Property "Samples.cancer_search" is not defined.
ファイルが実際に公開されていることを 2 回、3 回確認しました。このプロパティは、Samples モデルのルール内の「セーフ オン サーチ」リストにリストされています。プロパティは、モデルで public var として宣言されています。開発では完全に機能しますが、これらのファイル (およびアプリ全体) を本番環境に公開すると、プロパティが定義されていません。
これよりも奇妙なことに、私は製品サーバーに入り、悪いモデル、コントローラー、およびビューをコピーして新しい名前を使用し (同じ db テーブルを使用)、正常に動作しました。モデル、コントローラー、ビューの名前を Samples から SamplesTest/SamplesTestController に変更しただけで、うまくいきました。
すべてのキャッシュを無効にし (memcache を使用していた)、サーバーを再起動しました。それでも同じエラーが発生します。
モデル (製品ではなく開発で動作します。明確にするために短縮されています)
class Samples extends CActiveRecord
{
// .... //
// for search/sort on related data
public $cancer_search;
public $cancer_search_test;
// .... //
public function rules()
{
return array(
array('id, patient_id, cancer, cancer_id, cancer_search, cancer_search_test, requested_date, ...', 'safe', 'on'=>'search'),
);
}
public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'cancer' => array(self::BELONGS_TO, 'Cancers', 'cancer_id'),
'cancerTest' => array(self::BELONGS_TO, 'Cancers', 'cancer_id'),
)
}
public function attributeLabels()
{
return array(
'cancer_id' => 'Cancer Classification',
'cancer' => 'Cancer Classification',
'cancer_search' => 'Cancer Classification',
'cancer_search_test' => 'Cancer Classification',
);
}
public function search()
{
$criteria=new CDbCriteria;
$criteria->group = 't.id';
$criteria->together = true;
$criteria->with[] = 'cancer';
if($this->cancer_search) {
$criteria->addSearchCondition("cancer.name",$this->cancer_search);
}
$criteria->compare('id',$this->id,true);
$criteria->compare('patient_id',$this->patient_id,true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
'sort'=>array(
'attributes'=>array(
'cancer_search'=>array(
'asc'=>'cancer.name',
'desc'=>'cancer.name DESC',
),
'*',
),
),
));
}
および検索ビュー
// on production, this doesn't throw an error, but the search doesn't work
$columns[]= array(
'name' => 'cancer',
'value'=>'$data->cancer->name',
'type' => 'raw',
'htmlOptions'=>array('style'=>'width:100px;'),
);
// gives property not defined error on prod, even though it is defined, and works fine on dev
$columns[]= array(
'name' => 'cancer_search',
'value'=>'$data->cancer->name',
'type' => 'raw',
'htmlOptions'=>array('style'=>'width:100px;'),
);
// both of these work fine on dev.
Yii アセット フォルダをクリアしましたが、役に立ちませんでした。
私は気が狂っているのですか、それとも私が気付いていないキャッシングの可能性がありますか?
ありがとう。
--
もう 1 つの手がかり - 検索グリッドで、prod サーバーの列ヘッダーにも正しい属性ラベルが使用されていないことに気付きました。dev と prod で同じである理由がわかりません。
edit 2モデルでパブリック変数を宣言し、コントローラー検索メソッドでログにトレースするだけで、同じ取引を試みました。Var は dev には存在しますが、prod には存在しません。
edit 3 これで、何かがキャッシュされていることがわかりました。Samples モデルを削除したところ、古いキャッシュ バージョンが引き続き使用され、新しいプロパティが見つかりません。Memcached が無効になっており、mysql クエリ キャッシュをリセットしました。このファントムモデルを今でも使用しています。