【问题标题】:CakePHP MySQL virtual field problemCakePHP MySQL虚拟字段问题
【发布时间】:2011-07-07 15:52:18
【问题描述】:

我正在尝试以一种稍微复杂的方式对我的结果进行排序。我创建了一个名为“优先级”的虚拟字段来排序结果。这是我的代码:

    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) 的虚拟字段,它可以正常工作,但是将其中任何一个添加到该字段的其他部分都会使其失败。

【问题讨论】:

    标签: mysql cakephp cakephp-1.3


    【解决方案1】:

    问题在于((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)',
    );
    

    【讨论】:

    • 谢谢,已经解决了。知道为什么 ((Venue.image_count > 0) * 500) 自己返回 0 或 500 吗?
    猜你喜欢
    • 1970-01-01
    • 2013-12-23
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多