我最近一直在使用Fat-Free框架,而且一切进展顺利(可以说,我使用它的时间越长并利用其组件的使用时间越长越好);但是,在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则不行,但是我将表名注入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));

最佳答案

到目前为止,我唯一想出的答案(要沿这条路走)是创建另一个虚拟字段,然后将这两个部分拼凑在一起。

不理想,但是可以。

关于php - 无脂肪框架-防止将表名插入映射器对象的虚拟字段中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29524548/

10-12 12:46
查看更多