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

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

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

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

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

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

如果我可以在虚拟字段中定义自定义mysql函数,那么它将自动返回到结果集中
我能通过这个新领域的考试 select() 方法

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

但是我想全局定义,所以新字段不需要每次都传入 find 呼叫

mklgxw1f

mklgxw1f1#

cakephp3.x中的虚拟属性与cakephp2.x中的虚拟字段不同,后者用于sql查询,前者用于php级别,通常数据已经存在于实体中。
如果希望自定义字段出现在所有查询中,那么可以使用 Model.beforeFind() 事件相应地修改查询:

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

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

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

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

展开查看全部

相关问题