.* 不受 ORM 查询支持,它会将其转换为
Annonces.* AS Annonces__*
这是无效的 SQL。它适用于较低级别的数据库查询 (Connection::newQuery()),它不会添加别名,但不会返回实体,因此这可能不是您想要的。
见Cookbook > Database Access & ORM > Database Basics > \Cake\Database\Connection::newQuery()
传递一个表格对象
从 CakePHP 3.1 开始,您可以将表格对象传递给 Query::select(),这将导致表格的所有字段都被选中。
$this->Annonces
->find('all')
->select(['AnnoncesSuivis.id'])
->select($this->Annonces)
->join([
'table' => 'annonces_suivis',
'alias' => 'AnnoncesSuivis',
'conditions' => [ /* ... */ ],
])
->where($arrFiltres)
->order($arrOrder);
这样AnnoncesSuivis.id字段和Annonces的所有字段都会被选中。
见Cookbook > Database Access & ORM > Query Builder > Selecting All Fields From a Table
从架构构建字段
这也是在内部传递一个表对象会导致的,CakePHP
$query = $this->Annonces->find('all');
$fields = $query->aliasFields(
$this->Annonces->schema()->columns(),
$this->Annonces->alias()
);
$query
->select(array_merge(['AnnoncesSuivis.id'], $fields))
->join([
'table' => 'annonces_suivis',
'alias' => 'AnnoncesSuivis',
'conditions' => [ /* ... */ ],
])
->where($arrFiltres)
->order($arrOrder);
这也适用于可以传递给Table::find() 的fields 选项,但在这种情况下您必须使用单独的查询对象,例如
$fields = $this->Annonces->query()->aliasFields(
$this->Annonces->schema()->columns(),
$this->Annonces->alias()
);
$this->Annonces->find('all', [
'fields' => array_merge(['AnnoncesSuivis.id'], $fields)
// ...
]);
使用Query::autoFields()
在早期的 CakePHP 版本中,您还可以使用 Query::autoFields(),当设置为 true 时,将自动包含主表的字段和可能的包含。
见Cookbook > Database Access & ORM > Retrieving Data & Results Sets > Passing Conditions to Contain
在您通过Query::select() 设置字段之前,自动选择所有字段是默认行为,在这种情况下,您必须明确启用Query::autoFields()。
$this->Annonces
->find('all')
->select(['AnnoncesSuivis.id'])
->autoFields(true)
->join([
'table' => 'annonces_suivis',
'alias' => 'AnnoncesSuivis',
'conditions' => [ /* ... */ ],
])
->where($arrFiltres)
->order($arrOrder);
这应该会为您提供所需的查询,但是如上所述,这仅适用于主表和容器,如果您想包含手动连接表的所有字段,那么您必须通过以下方式指定它们一个。