我有一个名为Product
class Product extends AppModel {
public function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$file_name = (preg_replace('/\\.[^.\\s]{3,4}$/', '', $this->field('product_picture')));
$ext = end((explode(".", $this->field('product_picture')))); # extra () to prevent notice
$this->virtualFields['product_picture_thumbnail'] = $file_name."350x350.".$ext;
}
}
它有一个名为product_picture
的字段,类似于 img1.png 。我想创建一个基于该名称创建的虚拟字段,代表 img1350x350.png 之类的内容。
因此,当我查询时,它返回一个空列表。
$this->Product->find('all', array(
'fields' => array(
'product_picture',
'product_picture_thumbnail',
)));
答案 0 :(得分:1)
您正在将PHP代码与SQL代码混合在一起。虚拟字段仅在数据库可以解析时才有效。
如果您使用的是MySQL,以下内容应该有效:
public function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->virtualFields['product_picture_thumbnail'] = sprintf('
CONCAT(
SUBSTRING_INDEX(%s.product_picture,".",1),
"350x350.",
SUBSTRING_INDEX(%s.product_picture,".",-1)
)',
$this->alias, $this->alias) ;
}
我已经包含了动态生成模型名称的代码,因此它也适用于别名,如CakePHP 2.x: Virtual fields and model aliases中所述。