实体包含name getter时CakePHP表烘焙生成错误displayField的问题咨询
关于CakePHP烘焙虚拟字段作为displayField的问题
刚好之前碰到过类似的CakePHP烘焙场景,来给你梳理清楚:
烘焙不会自动将虚拟字段
name设为displayField
原因很直接:CakePHP的烘焙工具在生成表类时,只会读取数据库里的实际物理字段,根本不会去解析你实体类里的_virtual配置或者自定义的_getName()getter方法。它的默认逻辑是:如果表中有name物理字段就用它,没有的话就 fallback 到id。你的name是虚拟字段,数据库里根本不存在,所以烘焙工具完全识别不到,自然还是会把displayField设为id。你确实需要修改
table.twig模板来实现自动配置
如果想让烘焙出来的表类自动把displayField设为name(针对这种带name_en和name_fr的双语字段表),可以这么操作:- 找到烘焙模板文件
table.twig:默认在vendor/cakephp/bake/templates/Bake/Table/table.twig;如果你的项目用了自定义烘焙模板,就找项目目录下的templates/Bake/Table/table.twig。 - 找到设置displayField的代码块,默认是类似这样的:
{{ setDisplayField|raw }} - 修改成带有字段判断的逻辑,比如:
{% if 'name_en' in fields and 'name_fr' in fields %} $this->setDisplayField('name'); {% else %} {{ setDisplayField|raw }} {% endif %}
这样下次烘焙带有
name_en和name_fr字段的表时,就会自动把displayField设为你的虚拟字段name,不用每次手动改了。- 找到烘焙模板文件
小补充:如果这类表不多,也可以烘焙完成后手动修改表类里的
setDisplayField调用,不过改模板属于一劳永逸的方案,适合批量处理的场景。
内容的提问来源于stack exchange,提问作者TechFanDan
相关产品推荐
相关产品推荐

