如何在表默认字段之外选择特定字段?

时间:2015-02-13 19:32:22

标签: cakephp cakephp-3.0 query-builder

我希望使用JOIN从表格和CakePHP中的视图中选择数据,如下所示:

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

并希望能够从第一个表中选择所有字段,并选择连接表的som:

->select(['Annonces.*', 'AnnoncesSuivis.id']);

但这会产生错误的SQL查询。

2 个答案:

答案 0 :(得分:9)

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

这也适用于可以传递给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;