CakePHP模型virtualFields失效问题求助
我之前也碰到过一模一样的困扰——其他实体的virtualFields都正常跑,唯独某一个实体掉链子,给你几个针对性的排查方向:
核对VirtualField的定义细节
先把$virtualFields数组的语法盯死:有没有拼写错误?字段名是不是和实体的真实字段重名?如果涉及关联表计算,表别名是不是和查询里的一致?举个正确定义的例子:public $virtualFields = array( 'occupied_slots' => 'SubactivitySlots.total_slots - SubactivitySlots.available_slots' );重名是最容易踩的坑,virtualField的名字绝对不能和实体已有的真实字段重复,否则会被真实字段直接覆盖。
检查查询语句的字段指定
如果你在查询里手动指定了fields参数,一定要把virtualField的名字加进去,不然框架不会自动返回它。比如:
错误写法(只会返回指定的真实字段):$this->SubactivitySlots->find('first', array('fields' => array('id', 'subactivity_id')));正确写法(包含virtualField):
$this->SubactivitySlots->find('first', array('fields' => array('id', 'subactivity_id', 'occupied_slots')));要是不想手动列字段,直接去掉
fields参数就行,框架会自动包含所有真实字段和virtualField。排查关联查询的影响
如果你用了contain来关联其他模型,注意contain是分开执行查询的,主模型的virtualField可能不会被正确带入结果。这种情况下可以试试用joins替代contain来关联,确保virtualField的计算逻辑在主查询里完成。另外,用toArray()的时候,先确认查询结果本身已经包含了virtualField,不是转换过程中弄丢了。清除模型缓存&调试SQL
有时候框架的模型缓存会导致新添加的virtualField不生效,试试清空模型相关的缓存文件。另外,把生成的SQL语句打出来调试(比如CakePHP里用debug($query->sql())),看看virtualField对应的计算表达式有没有被正确加入到SQL里——如果SQL里根本没这个逻辑,那问题肯定出在定义或者查询的字段指定上。
内容的提问来源于stack exchange,提问作者Cafn

