【问题标题】:Agile Toolkit - OR statement in combination with Model敏捷工具包 - 与模型相结合的 OR 语句
【发布时间】:2013-07-29 14:45:11
【问题描述】:

我有一个模型,我想从中选择“调用者”或“被调用者”为给定值的所有行,以便在网格中显示。

我已经尝试了很多不同的方法来实现这一点,但无法做到。

我在网格上有一个工作过滤器,它按日期(开始和结束日期)、状态(“ANSWERED”、“NO_ANSWER”)缩小结果范围,我还可以为“调用者”和“被调用者”添加条件,但是我如何让它显示“调用者”或“被调用者”与当前 $UserID 匹配的所有行?基本上显示用户参与的所有呼叫(行)?

MySQL 查询本身是一个简单的 OR 结构,但我如何将其“输入”到模型或网格中,以便它与页面上的其他过滤器很好地配合?

【问题讨论】:

    标签: atk4 agiletoolkit


    【解决方案1】:

    您可以使用 DSQL 的 orExpr() 方法来生成您需要的 SQL。

    例如,

    $m = $this->model->debug();            // enable debug mode
    $user_id = $this->api->auth->model->id;// currently logged in user ID
    $q = $m->_dsql();                      // get models DSQL
    
    $or = $q->orExpr();                    // initialize OR DSQL object
    $or->where('caller', $user_id)         // where statements will be joined with OR
       ->where('callee', $user_id);
    
    // use one of these below. see which one works better for you
    $q->where($or);                        // add condition with OR statements
    $q->having($or);                       // add condition with OR statements
    

    当然你可以写得更短:

    $m = $this->model->debug();            // enable debug mode
    $user_id = $this->api->auth->model->id;// currently logged in user ID
    $q = $m->_dsql();                      // get models DSQL
    
    $q->where($q->orExpr()
        ->where('caller', $user_id)
        ->where('callee', $user_id)
    );
    

    【讨论】:

    • 哇,很棒的信息,我明天会玩这个。
    • 我是否正确假设 _dsql() 意味着您正在修改模型的底层 DSQL?我认为这是我正在努力弄清楚的一部分:-)
    • 工作就像一个魅力!再次感谢:-)
    • 是的 _dsql() 是 DSQL 的基础模型,但 dsql()(没有下划线前缀)是模型 DSQL 的克隆。我经常混合这两种,所以请注意:)
    • 也许像 $m->addCondition($q->orExpr(...)) 之类的东西也应该起作用,但我不确定。无论如何,我已经为自己定义了经验法则,以避免将模型方法与 DSQL 方法混合。如果我的 SQL 选择需要标准功能,那么我使用模型方法,但如果我需要更多标准(如 orExpr 或其他),那么我尝试使用 DSQL 设置所有 myconditions。否则,如果我们同时使用两者,可能会很难理解。也不要忘记 model->debug() 和 dsql->debug() 方法。这些通常有助于了解幕后发生的事情:)
    猜你喜欢
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    相关资源
    最近更新 更多