Использование функций для определения значений виртуальных полей в 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
вместо.