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

bq9c1y66  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(360)

是他们的方式,我们可以在实体中添加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 呼叫

mklgxw1f

mklgxw1f1#

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

另请参见
食谱>数据库访问和orm>表对象>生命周期回调>beforefind
食谱>数据库访问和orm>实体>创建虚拟属性
食谱>数据库访问和orm>检索数据和结果集>使用查找器加载数据
食谱>数据库访问和orm>检索数据和结果集>自定义查找器方法
食谱>数据库访问和orm>查询生成器>使用sql函数

相关问题