Виртуальное поле CakePHP, которое является суммой трех других виртуальных полей? - PullRequest
1 голос
/ 05 октября 2010

У меня есть виртуальное поле в CakePHP, которое должно быть суммой трех очень разных SQL-запросов в моей модели User. Я пытаюсь сделать это, имея виртуальное поле, которое является суммой 3 других виртуальных полей.

var $virtualFields = array (
        'field_one' => 'select coalesce(sum(coalesce(t_a.field, 0)), 0)*10 as field_one from t_a join t_b on t_a.t_b_id = t_b.id where t_b.user_id=User.id',
        'field_two' =>  'select coalesce(sum(coalesce(t_c.field, 0)), 0)*2 as field_two from t_d left join (t_c) on (t_d.id=t_c.t_d_id) where t_d.user_id = User.id',
        'field_three' => 'select coalesce(sum(coalesce(value, 0)), 0) as field_three from t_e where user_id=User.id',
        'field_sum' => 'User.field_one+User.field_two+User.field_three'
    );

Это не работает. Я получаю сообщение об ошибке «field_one не существует», когда он попадает в поле «field_sum». Я уже спрашивал, как объединить три SQL-предложения, и не получил удовлетворительного ответа. Оказалось, что гораздо проще и проще управлять ими в одиночку и суммировать их по факту. Есть ли способ сделать это в контексте CakePHP?

Редактировать

Вот сгенерированный SQL торта:

SELECT 
    /* Users fields */
    (select coalesce(sum(coalesce(t_a.field, 0)), 0)*10 as field_one from t_a join t_b on t_a.t_b_id = t_b.id where t_b.user_id=User.id) AS `User__field_one`, 
    (select coalesce(sum(coalesce(t_c.field, 0)), 0)*2 as field_two from t_d left join (t_c) on (t_d.id=t_c.t_d_id) where t_d.user_id = User.id) AS  `User__field_two`, 
    (select coalesce(sum(coalesce(value, 0)), 0) as bonus_reputation from reputation_bonuses where user_id=User.id) AS  `User__field_three`,        (`User`.`field_one`+`User`.`field_two`+`User`.`field_three`) AS  `field_sum`, 
    FROM `users` AS `User`   
    WHERE `User`.`email` = '/* redacted */' AND `User`.`password` = '/* redacted */'    LIMIT 1 

Увидев, что я попытался изменить определение на (User__field_one+User__field_two+User__field_three), чтобы воспользоваться тем, как они были названы. Не повезло.

Точная ошибка: Ошибка SQL: 1054 неизвестных столбца User.field_one в списке полей.

Ответы [ 2 ]

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

Я сделал нечто похожее в конструкторе моделей, переработав фрагменты SQL. Не самый эффективный, но это может сработать. Что-то вроде:

function __construct($id = false, $table = null, $ds = null) {
    $snippet1 = 'select coalesce(sum(coalesce(t_a.field, 0)), 0)*10 as field_one from t_a join t_b on t_a.t_b_id = t_b.id where t_b.user_id=User.id';
    $snippet2 = 'select coalesce(sum(coalesce(t_c.field, 0)), 0)*2 as field_two from t_d left join (t_c) on (t_d.id=t_c.t_d_id) where t_d.user_id = User.id';
    $snippet3 = 'select coalesce(sum(coalesce(value, 0)), 0) as field_three from t_e where user_id=User.id';

    $this->virtualFields['field_one'] = $snippet1;
    $this->virtualFields['field_two'] = $snippet2;
    $this->virtualFields['field_three'] = $snippet3;

    $this->virtualFields['field_sum'] = $snippet1.' + '.$snippet2.' + '.$snippet3;

    parent::__construct($id, $table, $ds);
}
1 голос
/ 05 октября 2010

Просто удалите псевдоним:

'field_sum' => 'field_one + field_two + field_three'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...