Как включить ассоциации в find () с fieldlist - PullRequest
0 голосов
/ 25 октября 2010

Я хочу получать данные модели с помощью find (all), но пользователь должен получить только ограниченный набор полей таблицы. Это просто:

$ret = $this->find('all',array('fields'=>array(
    'Employee.id','Employee.address_id'
)));

Но эта модель (модель «Сотрудники») также имеет ассоциацию с принадлежностью:

var $belongsTo = array(
    'Address' => array(
        'className' => 'Address',
        'foreignKey' => 'address_id',
        'fields' => array('Address.full_name')
    )
);

Я хочу, чтобы поле Address.full_name также отображалось в моих извлеченных данных. Но он не работает с вышеуказанным вызовом find () и выдает ошибку (ошибка SQL: 1054: неизвестный столбец 'Address.full_name' в 'списке полей') при попытке выполнить следующее:

'fields'=>array('Employee.id','Employee.address_id','Address.full_name')

Кто-нибудь знает, как это решить?

РЕДАКТИРОВАТЬ: Я полностью забыл, что Address.full_name является виртуальным полем. Глядя на SQL, созданный Cakephp, становится понятно, почему он не работает:

SELECT
    `Employee`.`id`, `Employee`.`address_id`, `Address`.`full_name`
FROM
    `employees` AS `Employee`
    LEFT JOIN `addresses` AS `Address`
        ON (`Employee`.`address_id` = `Address`.`id`)
WHERE 1 = 1

В модели адреса полное_имя определяется следующим образом:

var $virtualFields = array(
    'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)'
);

Итак, вопрос заключается в следующем: это ошибка CakePHP, из-за которой он не может включать виртуальные поля (сторонней модели) в список полей, предоставленный для поиска ()?

Ответы [ 3 ]

1 голос
/ 25 октября 2010

К сожалению, вы не можете использовать виртуальные поля так, как вы хотите.Из Ограничения виртуальных полей в документации Cake:

Реализация virtualFields в 1.3 имеет несколько ограничений.Во-первых, вы не можете использовать virtualFields в связанных моделях для условий, порядка или массивов полей.Это обычно приводит к ошибке SQL, поскольку поля не заменяются ORM.Это потому, что трудно оценить глубину, на которой может быть найдена связанная модель.

Похоже, вам придется использовать поведение Containable.

0 голосов
/ 25 октября 2010

Ошибка SQL: 1054: неизвестный столбец 'Address.full_name' в 'списке полей')

Эта ошибка дает вам понять, что что-то не так с любым вызовом имени столбцаэто может быть fullname, а не full_name) или, более вероятно, ваше определение модели.Сотрудник принадлежит к адресу, но у него есть один или много сотрудников?

0 голосов
/ 25 октября 2010

Я бы использовал поведение Containable в этом случае.

Сначала убедитесь, что в вашей модели Employee загружено поведение Containable:

var $actsAs = array('Containable');

Затем, когда вы пытаетесь получить данные, сделайте это так:

$params = array('fields' => array('Employee.id', 'Employee.address_id'), 
    'contain' => array('Address' => array('fields' => array('Address.full_name')));
$ret = $this->find('all', $params);

Подробнее о содержании поведения здесь: http://book.cakephp.org/view/1323/Containable

...