有一种方法可以选择要在数据中加载的虚拟字段? Cakephp 3

问题描述

我的实体上有一些虚拟字段,并且控制器上有一点我不想加载它们,只是不需要这些值。有没有办法不加载我的虚拟字段

$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