CakePHP MySQL проблема виртуального поля - PullRequest
1 голос
/ 07 июля 2011

Я пытаюсь упорядочить свои результаты немного сложным способом. Я создал виртуальное поле под названием «приоритет», чтобы упорядочить результаты по. Вот мой код:

    public $virtualFields = array(
    'priority'=>'(Venue.featured * 5000) + (Venue.views * 2) + ((Venue.image_count > 0) * 500)',
);

Теперь это всегда возвращает только значение ((Venue.image_count> 0) * 500), т.е. либо 500, либо 0. Если я удаляю эту часть поля, оставляя:

public $virtualFields = array(
    'priority'=>'(Venue.featured * 5000) + (Venue.views * 2)',
);

Ожидаемый результат дается. Я также хочу добавить еще один компонент в поле, который имеет тот же эффект. Код:

public $virtualFields = array(
    'priority'=>'(Venue.featured * 5000) + (Venue.views * 2) + ((CHAR_LENGTH(Venue.blurb) > 0) * 500)',
);

В этом случае, опять же, поле всегда равно 500 или 0, а не полному значению всех полей.

Я не понимаю, что происходит! Если я создаю виртуальное поле, которое измеряет либо image_count, либо CHAR_LENGTH (Venue.blurb), оно работает нормально, но добавление любого из них в другие части поля приводит к сбою.

1 Ответ

1 голос
/ 07 июля 2011

Проблема в том, что синтаксис для ((Venue.image_count > 0) * 500) и ((CHAR_LENGTH(Venue.blurb) > 0) * 500) неверен.

Вы должны использовать оператор IF:

IF(Venue.image_count > 0, 500, 0)
IF(CHAR_LENGTH(Venue.blurb) > 0, 500, 0);

Например:

public $virtualFields = array(
  'priority' => '(Venue.featured * 5000) + (Venue.views * 2) + IF(Venue.image_count > 0, 500, 0)',
);
...