Fat-Free-Framework - 防止将表名插入到mapper对象的虚拟字段中

时间:2015-04-08 20:18:19

标签: php mysql orm fat-free-framework

我最近一直在使用无脂肪框架,事情进展顺利(可以说,我使用它的时间越长,并利用其组件);但是,我在ORM中将MySQL表名注入虚拟字段(用于查找)时遇到了困难。

我知道SQL很好,而且我知道我可以执行第二次数据库调用来检索查找字段数据,但是因为我已经开始使用虚拟字段格式(并且它可能是最容易消化和调试)...

有没有办法阻止F3在SQL生成期间插入表名?

设置很简单......

class Bookmark extends \DB\SQL\Mapper

在构造函数中,在调用父构造函数之后,我添加了我的虚拟字段......

$this->type_name = '
    SELECT CASE bookmark_type_id 
    WHEN 1 THEN \'Project\' 
    WHEN 2 THEN \'Member\'
    ELSE \'Unknown\' END
';

注意:这可行,但如果我使用IF,则 NOT ,然后我将表名注入IF子句 - 在第一个逗号之后。

$this->description = '
    SELECT CASE bookmark_type_id 
    WHEN 1 THEN (SELECT p.title FROM projects p WHERE p.id = reference_id)
    WHEN 2 THEN (SELECT CONCAT_WS(\' \', m.first_name, m.last_name) FROM members m WHERE m.id = reference_id)
    ELSE \'Unknown\' END
';

注意:此失败,在第一个逗号后插入表名(即在m.first_name之前)。

为清楚起见,这是结果(注意`cm_bookmark`。):

SELECT CASE bookmark_type_id 
    WHEN 1 THEN (SELECT p.title FROM projects p WHERE p.id = reference_id)
    WHEN 2 THEN (SELECT CONCAT_WS(' ',`cm_bookmark`. m.first_name, m.last_name) AS FullName FROM members m WHERE m.id = reference_id)
    ELSE 'Unknown' END
) AS `description`

我觉得这只是另一个"不要这样做"情况,但任何关于如何在F3中实现这一点的想法将不胜感激。

奇怪的是,它只是在子查询中的第一个逗号之后。如果表名插入一直很聪明,我希望看到它也在m.last_name前面,但它不是。

编辑:好像它与括号中第二次出现的东西有关。我在另一个虚拟字段调用中使用了CONCAT(),它工作正常 - 但它是字段设置中第一次(也是唯一)使用括号。如果我删除对CONCAT_WS()的调用并返回单个字段,则上面的设置工作正常。

EDIT2:为了阐明负载是如何发生的,请参见下文......

// database setup
// (DB_* set up in config.ini)
$db = new \DB\SQL($f3->get('DB_CONN'), $f3->get('DB_USER'), $f3->get('DB_PASS'));
$f3->set('DB', $db);

...

// Actual call
$db = \Base::instance()->get('DB');
$bookmark = new \CM\Models\Bookmark($db);
$bookmark->load_by_id($item['id']);

...

// in Bookmark Class (i.e. load_by_id)
$b->load(array('id=?', $id));

2 个答案:

答案 0 :(得分:0)

唯一的答案(留在这条路上)到目前为止,我想出的是创建另一个虚拟区域,然后将这两个部分组合在一起。

不理想,但有效。

答案 1 :(得分:0)

映射器不允许这样的高级功能,但我建议您使用Cortex,幸运的是扩展了映射器,因此没有太多的代码更改。

以下是一个例子:

Class Bookmark extends \DB\Cortex{
protected
    $db = 'DB', // From $f3->set('DB', $db); 
    $table = 'bookmarks'; // your table name
    /* You can also define these custom field preprocessors as a method within the class, named set_* or get_*, where * is the name of your field.*/
    public function get_desciption($value) {
        switch($this->bookmark_type_id){
             case "1":
             /*.....................Hope you get the drill*/
        }
    } 
}