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

问题描述 投票:1回答:1

是他们的方式,我们可以在Entity中添加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调用

mysql cakephp orm cakephp-3.0 sql-function
1个回答
1
投票

CakePHP 3.x中的虚拟属性与CakePHP 2.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');

也可以看看

© www.soinside.com 2019 - 2024. All rights reserved.