gpt4 book ai didi

cakephp - 除了表格默认字段外,如何选择特定字段?

转载 作者:行者123 更新时间:2023-12-04 13:32:00 27 4
gpt4 key购买 nike

我想使用JOIN从CakePHP的表和 View 中选择数据,如下所示:

$this->Annonces->find('all')
->where($arrFiltres)
->order($arrOrder)
->join([
'table' => 'annonces_suivis',
'alias' => 'AnnoncesSuivis',
'conditions' => [...],
]);

并希望能够从第一个表和联合表的som中选择所有字段,如下所示:
->select(['Annonces.*', 'AnnoncesSuivis.id']);

但这会创建错误的SQL查询。

最佳答案

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

这对于可以传递给 fieldsTable::find()选项也适用,尽管在这种情况下,您必须使用单独的查询对象,例如
$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);

这应该为您提供所需的查询,但是如上所述,这仅适用于主表和包含,如果您想包括手动联接表的所有字段,则必须一一指定。

关于cakephp - 除了表格默认字段外,如何选择特定字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28507328/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com