Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有一种方法可以选择我想用数据加载哪些虚拟字段?CakePHP3_Php_Cakephp_Cakephp 3.0 - Fatal编程技术网

有一种方法可以选择我想用数据加载哪些虚拟字段?CakePHP3

有一种方法可以选择我想用数据加载哪些虚拟字段?CakePHP3,php,cakephp,cakephp-3.0,Php,Cakephp,Cakephp 3.0,我的实体上有一些虚拟字段,我的控制器上有一点我不想加载它们,只是不需要这些值。有没有办法不加载我的 $this->Model->get($id) ? 类似于unset或[''u virtual'=>false] 谢谢 我不相信虚拟字段实际上是在显式执行getter之前生成的,例如toArray调用,它可以通过将实体粘贴到debug中显示或为JSON响应序列化来自动触发。简单地调用Model->get不会为这些虚拟值设定种子 因此,我认为没有多少选择: 选项1:如果您通常希望在大多数

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

$this->Model->get($id)
?

类似于unset或[''u virtual'=>false]


谢谢

我不相信虚拟字段实际上是在显式执行getter之前生成的,例如toArray调用,它可以通过将实体粘贴到debug中显示或为JSON响应序列化来自动触发。简单地调用Model->get不会为这些虚拟值设定种子

因此,我认为没有多少选择:

选项1:如果您通常希望在大多数位置使用这些虚拟字段,但这次不需要,请执行以下操作之一:

获取后的更改,例如:

$entity = $this->Model->get($id)
$entity->setVirtual([]); // Or list just the properties you still want in the array 
。。或b标记它们,使其不会在任何显示的值中自动引用,例如:

$entity = $this->Model->get($id)
$entity->setHidden(['virtual_field_you_want_to_hide']); 
选项2:如果实际上您不想在JSON导出之类的情况下大部分时间都输出此字段,只想按需引用它,那么这就是Cake's的用途,在实体中标记它$\u hidden:

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

    public function _getMyField(){
        return 'my_field_value'; 
    }
}
这样,简单地调用get不会调用虚拟字段的getter,也不会以任何方式显示实体。仅直接调用字段将调用_getMyFieldgetter,例如:

$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"

现在还不清楚你想要完成什么。虚拟字段就是这样,它们是虚拟的。它们不会从数据库中加载。如果你不访问它们,它们就永远不存在。请澄清您试图解决的具体问题。抱歉,实际上我对虚拟字段及其公开版本感到困惑,我认为我需要在我的$\u虚拟阵列和他的get方法上使用它,但不是它。我意识到$\u虚拟数组将在被调用的对象和数组中显示这些数据,实际使用预期的值,只需根据get约定调用属性名称,而不必将其放在$\u虚拟属性上。就是这样,我花了这么多时间才自己弄明白啊哈哈,如果我早一点问这个问题,你的回答会帮我避免很多思维过度,哈哈哈。非常感谢。我已经测试了setHidden选项,它一直显示在结果的隐藏数组上设置的$\u虚拟属性的结果,对吗?我正在努力提高我的系统性能,这就是为什么我现在不需要虚拟字段从数据库中选择数据的原因。顺便说一句,如果$\u virtual为空,那么使用setVirtual方法调用这些值就可以很好地工作;在您仍然看到虚拟属性的地方,它是来自调试吗?我现在才想起EntityTrait有一个特殊的uuu debugInfo函数,它可以手动调用每个虚拟字段,而不管在使用debug输出实体时是否隐藏,所以我对此有点不满意。但它不应该像JSON输出或只是在后台调用数组的东西一样显示出来,更清楚的是,拥有虚拟字段不会增加数据库开销。它们完全在PHP代码中作用于内存中已有的数据,而且只有当某个对象明确请求时,尽管该对象可能是JSON转换或调试输出。这是一个很好的观点,在我的示例中肯定是正确的&可能大多数人都使用虚拟字段-但没有什么可以阻止您使用虚拟字段进行数据库调用或进行一些复杂的计算,然而,我有点假设这里的情况就是这样