代码之家  ›  专栏  ›  技术社区  ›  Girish

是否可以在实体中定义虚拟字段(SQL函数调用)?

  •  1
  • Girish  · 技术社区  · 6 年前

    是他们的方式,我们可以在实体中添加MySQL自定义函数

    protected $_virtual = ['check_tenant' => '(check_tenant(Tenants.id))']; 
    

    我想用以下查询 find() 方法

    //SELECT id, first_name, check_tenant(Tenants.id) FROM tenants AS Tenants
    
    $this->Tenants->find()->all();
    

    如果我可以在虚拟字段中定义自定义MySQL函数,那么它将自动返回到结果集中

    我能通过这个新领域的考试 select() 方法

    $this->Tenants->find()
    ->select(['id', 'check_tenant' => '(check_tenant(Tenants.id))'])->all();
    

    find 呼叫

    1 回复  |  直到 6 年前
        1
  •  1
  •   ndm    6 年前

    事实上的 属性 在CakePHP中,3.x与virtual不同 领域 在cakephp2.x中,后者用于SQL查询,前者用于PHP级别,通常用于实体中已经存在的数据。

    如果希望自定义字段出现在 全部的 例如,您可以使用 Model.beforeFind() 事件相应地修改查询:

    // in TenantsTable class
    
    public function beforeFind(\Cake\Event\Event $event, \Cake\ORM\Query $query, array $options)
    {
        return $query
            // select custom fields (functions builder usage not required, but advised)
            ->select(function (\Cake\ORM\Query $query) {
                return ['check_tenant' => $query->func()->check_tenant([
                    'Tenants.id' => 'identifier'
                ])];
            })
            // ensure that the tables default fields are being selected too
            ->enableAutoFields(true); // autoFields() before CakePHP 3.4
    }
    

    另一个侵入性较小的选项是定制查找器,您可以在需要它们的地方显式使用它们:

    // in TenantsTable class
    
    public function findWithTenantCheck(\Cake\ORM\Query $query, array $options)
    {
        return $query
            ->select(/* ... */)
            ->enableAutoFields(true);
    }
    
    // query data
    
    $query = $this->Tenants->find('withTenantCheck');
    

    另请参见