从现有字段在构造函数中创建虚拟字段

时间:2017-10-19 11:13:12

标签: php sql cakephp cakephp-2.0

我有一个名为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', 
)));

1 个答案:

答案 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中所述。