我有

Contact Table : id, first_name, last_name, company_id
Company Table : id, name

我想在联系人表中创建虚拟字段,因此它将显示为“contactInCompany”
"first_name last_name - Company.name" e.g: Andre Robin - Google

我如何才能做到这一点,我尝试这种方式,但是它不起作用,它不接受另一个虚拟字段作为输入
public $virtualFields = array(
    'companyName' => 'SELECT name FROM companies where id = Contact.company_id',
    'customerWithCompany' => "CONCAT(Contact.first_name, ' ',
                              Contact.last_name, ' ', Contact.companyName, '')"
    );

我也用这种方法尝试过,它不起作用
'customerWithCompany' => "CONCAT(Contact.first_name, ' ', Contact.last_name, '-',
                         SELECT name FROM companies where id = Contact.company_id)"

我经常需要这样做,我将使用它在下拉选择框中选择联系人,因此我希望将联系人姓名与公司一起显示

最佳答案

您无法使用虚拟字段执行此操作,因为虚拟字段中的键只是别名

例:

class Contact extends AppModel {

  public $virtualFields = array(
      'companyName' => 'SELECT name FROM companies where id = Contact.company_id',
      'customerWithCompany' => "CONCAT(Contact.first_name, ' ',
                                 Contact.last_name, ' ', Contact.companyName, '')"
       );

    public function getContacts() {
      return $this->find('all', array(
                   'fields'=>array(
                            'Contact.id',
                            'Contact.first_name',
                            'Contact.companyName',
                            'Contact.customerWithCompany'
                           )
                    )
               );
    }

}

如果从ContactsController调用getContacts()方法

上面的代码将构成此查询:
SELECT Contact.id, Contact.first_name,
       (SELECT name FROM companies where id = Contact.company_id) AS Contact__companyName,
       CONCAT(Contact.first_name, ' ', Contact.last_name, ' ', Contact.companyName, '') AS Contact__customerWithCompany
FROM contacts AS Contact;

由于无法访问另一列的1列的别名,因此该查询将不会在mysql上执行。

为此,您必须使用如下子查询:Cake php将虚拟字段名称转换为Model __(在下面的示例中为Contact__)
SELECT
SubQuery.id,
SubQuery.first_name,
SubQuery.Contact____companyName,
CONCAT(SubQuery.first_name, ' ', SubQuery.last_name, ' ', SubQuery.Contact____companyName, '') AS Contact__customerWithCompany

FROM
(SELECT Contact.id, Contact.first_name, (SELECT name FROM companies where id = Contact.company_id) AS Contact__companyName
FROM contacts AS Contact) AS SubQuery;

如果要在蛋糕php中构建子查询,请使用 buildStatement 数据源方法

注意:使用联接是上述查询的另一个更好的解决方案,可以在不使用子查询的情况下获得相同的结果。

带联接:
public function getContacts() {
    $this->virtualFields['customerWithCompany'] = "CONCAT(Contact.first_name, ' ', Contact.last_name, ' ', Company.name)";
    return $this->find('all', array(
            'fields'=>array(
                'Contact.id',
                'Contact.first_name',
                'Contact.last_name',
                'Company.name',
                'Contact.customerWithCompany'
            ),
            'joins'=>array(
                array(
                    'table'=>'companies',
                    'alias'=>'Company',
                    'type'=>'LEFT',
                    'conditions'=>array(
                        'Contact.company_id = Company.id'
                    )
                )
            )
        )
    );
}

09-25 21:36