问题描述
我的实体上有一些虚拟字段,并且控制器上有一点我不想加载它们,只是不需要这些值。有没有办法不加载我的虚拟字段
$this->Model->get($id)
?
类似unset
或['_virtual' => false]
谢谢!
解决方法
我不相信虚拟字段实际上是在直到实际生成的,即明确执行其getter的操作。 svg.append("g")
.attr("class","y axis")
.call(yAxis)
.call(g => g.select('.tick:first-of-type line').remove())
.call(g => g.selectAll(".tick line")
.attr("class","axis_bar")
.attr("stroke","#E8E8E8"))
调用,可以通过将实体粘贴在toArray()
或debug()
中以显示JSON响应来自动触发该实体。仅仅调用_serializing
并不会植入这些虚拟值。
所以我相信有几种选择:
选项1:如果您通常希望在大多数地方使用这些虚拟字段,但在此get()调用中不希望一次,
(a),在get()之后更改virtual listing at runtime,例如:
Model->get()
。。或(b)将它们标记为hidden at runtime,这样就不会在任何显示的值中自动引用它们,例如:
$entity = $this->Model->get($id)
$entity->setVirtual([]); // Or list just the properties you still want in the array
选项2::如果实际上您不仍希望大部分时间(在JSON导出等方式中)始终输出此字段,而只想引用它是按需的,这就是Cake的$_hidden的用途,在实体中将其标记为$ _hidden:
$entity = $this->Model->get($id)
$entity->setHidden(['virtual_field_you_want_to_hide']);
有了这个,简单地调用get()不会调用虚拟字段的getter,也不会以任何方式显示实体。仅直接调用该字段会调用class MyEntity extends Entity
{
protected $_virtual = ['my_field'];
protected $_hidden = ['my_field'];
public function _getMyField(){
return 'my_field_value';
}
}
getter,例如:
_getMyField