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

标签 mysql cakephp orm cakephp-3.0 sql-function

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

最佳答案

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');

另见

关于mysql - 是否可以在实体中定义虚拟字段(SQL 函数调用)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52362171/

相关文章:

PHP 到 JSON 编码数据不起作用

php - Cake PHP 主题集成

php - beforeFilter() 没有被调用?

javascript - cakePHP 和 Google AdSense

java - Play Framework (Java) 的数据库优先 ORM,具有自动 DB 模型生成功能

javascript - ORM:更新给定实例的所有模型

mysql - Coldfusion Post 到查询以构建查询

python sqlite3 查询.db文件的表名和列名

mysql - 用父子关系连接三个表

java - 为什么 Hibernate 插入带有外键的父行而不插入子行?