有一种方法可以 select 我想用我的数据加载哪些虚拟字段?蛋糕PHP 3

There is a way to select which virtual fields I want to load with my data? Cakephp 3

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

中的虚拟字段
$this->Model->get($id)

?

类似于 unset['_virtual' => false]

谢谢!

我不相信虚拟字段实际上是生成的 直到 某些东西明确地执行它们 getter,即。一个 toArray() 调用,它可以通过将实体粘贴到 debug()_serializing 中显示实体来自动触发,以获得 JSON 响应。简单地调用 Model->get() 不会播种这些虚拟值。

所以我认为没有几个选择:

选项 1: 如果您 通常 在大多数地方想要这些虚拟字段,但在这一次 get()调用,或者:

(a) 更改get() 之后的virtual listing at runtime,例如:

$entity = $this->Model->get($id)
$entity->setVirtual([]); // Or list just the properties you still want in the array 

.。或 (b) 将它们标记为 hidden at runtime 这样它们就不会在任何显示值中自动引用,例如:

$entity = $this->Model->get($id)
$entity->setHidden(['virtual_field_you_want_to_hide']); 

选项 #2: 如果实际上您 不希望 无论如何大多数时间都输出此字段(在 JSON exports 等等)并且只想在需要时引用它,这就是 Cake 的 $_hidden 的用途,在实体中将其标记为 $_hidden:

class MyEntity extends Entity
{
    protected $_virtual = ['my_field'];
    protected $_hidden = ['my_field'];

    public function _getMyField(){
        return 'my_field_value'; 
    }
}

有了这个,简单地调用 get() 将不会调用虚拟字段的 getter,也不会以任何方式显示实体。只有直接调用该字段才会调用 _getMyField getter,例如:

$entity = $this->Model->get($id);
print_r($entity); // Doesn't output my_field by default
echo $entity->my_field; // Only now call _getMyField, and this outputs "my_field_value"