我希望使用JOIN从表格和CakePHP中的视图中选择数据,如下所示:
$this->Annonces->find('all')
->where($arrFiltres)
->order($arrOrder)
->join([
'table' => 'annonces_suivis',
'alias' => 'AnnoncesSuivis',
'conditions' => [...],
]);
并希望能够从第一个表中选择所有字段,并选择连接表的som:
->select(['Annonces.*', 'AnnoncesSuivis.id']);
但这会产生错误的SQL查询。
答案 0 :(得分:9)
.*
,它会将此转换为
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中也支持它< 3.1。
$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);
这也适用于可以传递给fields
的{{1}}选项,但在这种情况下您必须使用单独的查询对象,例如
Table::find()
$fields = $this->Annonces->query()->aliasFields(
$this->Annonces->schema()->columns(),
$this->Annonces->alias()
);
$this->Annonces->find('all', [
'fields' => array_merge(['AnnoncesSuivis.id'], $fields)
// ...
]);
在更早的CakePHP版本中,您还可以使用Query::autoFields()
,当设置为Query::autoFields()
时,它将自动包含主表的字段和可能的包含。
参见 Cookbook > Database Access & ORM > Retrieving Data & Results Sets > Passing Conditions to Contain
在您通过true
设置字段之前,自动选择所有字段是默认行为,在这种情况下,您必须明确启用Query::select()
。
Query::autoFields()
这应该为您提供所需的查询,但是如上所述,这只适用于主表和包含,如果您想要包含手动连接表的所有字段,那么您必须逐一指定它们。
答案 1 :(得分:0)
您还可以在实体中创建虚拟字段:
ControlTemplate
echo $ entity-> full_name;