Вопрос

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

$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 Поле, чтобы появиться в моих привлеченных данных. Но это не работает с вызовом FACE () выше, и он бросает ошибку (ошибка SQL: 1054: неизвестный столбец »Address.full_Name 'в« Список полей ») при попытке этого:

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

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

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

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

В адресной модели Full_Name определяется так:

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

Итак, тогда вопрос: это ошибка CakePhP, которая не в состоянии включить (внешнюю модель) виртуальных полей в полевой группе, прилагаемой для поиска ()?

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top