是他们的方式,我们可以在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');
也可以看看