Использование функций для определения значений виртуальных полей в CakePHP

Я хочу сделать что-то вроде (весь этот код будет внутри модели, естественно):

public $virtualFields = array(
    'description' => $this->fillDescription()
);

private function fillDescription() {
    $type = $this->data['type'];
    $quantity = $this->data['quantity'];
    switch($type) {
        case 'type A':
            'This should be a specific description for type A records and this record has quantity:'.$quantity;
            break;
        case 'type B':
            'This should be a specific description for type B records and this record has quantity:'.$quantity;
            break;
        etc...
    }
}

Есть ли способ сделать это в модели, или мне действительно нужно создать это виртуальное поле на лету?

1 ответ

Решение

Вы можете сделать это с помощью виртуальных полей следующим образом:

public $virtualFields = array(
    'description' => '
      CASE 
      WHEN type = "A" THEN CONCAT("quantity a description ", quantity)
      WHEN type = "B" THEN CONCAT("quantity b description ", quantity)
      WHEN type = "C" THEN CONCAT("quantity c description ", quantity)
      END
    '
);

Я не очень знаком с MySQLCASE но это должно быть то, что вы ищете.

Если вы хотите сделать это с помощью PHP в модели, сделайте это при построении модели:

public function __construct($id = false, $table = null, $ds = null) {
    $this->virtualFields['description'] = $this->fillDescription();
    parent::__construct($id, $table, $ds);
}

private function fillDescription() {
     $out = 'CASE';
     $out .= ' WHEN type = "A" THEN CONCAT("quantity a description ", quantity)';
     $out .= ' WHEN type = "B" THEN CONCAT("quantity a description ", quantity)';
     $out .= ' WHEN type = "C" THEN CONCAT("quantity a description ", quantity)';
     $out .= ' END';
     return $out;
}

Если вам нужно выполнить логику против quantity или же typeПредлагаю использовать afterFind вместо.

Другие вопросы по тегам