解决方案:
应用程序的 Document Root 中有一个 Samples.php 文件。这在应用程序的正常 Yii 执行链中是如何实际运行的,我无法理解。但确实如此,我删除了它,现在一切正常。谢谢!
更新:这几乎可以肯定是一个应用程序级别的缓存问题,除了所有缓存(我知道的)都被禁用。我可以进入生产模型文件夹并删除各种模型,然后 Yii 立即抛出这些模型不存在的预期错误。Samples 模型并非如此。它留在身边。
Yii Search 有一个非常奇怪的问题。
我正在做的是搜索相关模型,就像我之前做过 100 次一样。这在我的开发主机上运行良好,但一旦我将其发布到生产主机,它就会失败:属性“Samples.cancer_search”未定义。
我已经两次和三次检查文件是否实际正在发布。该属性列在 Samples 模型的规则中的“搜索时安全”列表中。该属性在模型中被声明为公共变量。在开发中完美运行,但是当我将这些文件(甚至整个应用程序)发布到生产环境时,它仍然没有定义属性。
比这更奇怪的是,我进入 prod 服务器并复制了错误的模型、控制器和视图以使用新名称(使用相同的 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 资产文件夹,但无济于事。
我要疯了还是他们可能有一些我不知道的缓存?
谢谢。
--
另一个线索——我在搜索网格中注意到,在 prod 服务器上,它也没有在列标题中使用正确的属性标签。不知道为什么在 dev 和 prod 上是一样的。
编辑 2 我尝试简单地在模型中声明一个公共 var 并将其跟踪到控制器搜索方法中的日志,同样的处理。var 存在于 dev 上,但不存在于 prod 上。
编辑 3 现在我知道有些东西正在被缓存。我刚刚删除了 Samples 模型,它继续使用未找到我的新属性的旧缓存版本。Memcached 被禁用,我重置了 mysql 查询缓存。仍然使用这个幻像模型。