Вы не можете сделать это с помощью виртуальных полей в качестве ключей в виртуальных полях лишь псевдоним
Пример:
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'
)
)
);
}
}
Если getConta Метод КТС() вызывается из ContactsController
Приведенный выше код будет формировать этот запрос:
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;
Этот запрос не будет выполнен на MySQL, поскольку это не возможно, чтобы получить доступ к псевдоним 1 колонки для другого колонка.
Для достижения этой цели вам придется использовать подзапросы, как показано ниже: 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 Метод DataSource
Примечание: Использование присоединяется еще одно лучшим решением для вышеупомянутого запроса, чтобы достичь тех же результатов без использования вложенных запросов.
С Соединения:
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'
)
)
)
)
);
}
Вы назначили ассоциации для всех этих моделей должным образом? Я имею в виду, вы указали индексы? – Fury