首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Lithium查找中排除结果

从Lithium查找中排除结果
EN

Stack Overflow用户
提问于 2011-02-16 11:55:25
回答 2查看 2K关注 0票数 4

我想排除对Lithium模型的find()方法的调用结果。对于同时具有MongoDB和MySQL数据源的模型,我需要这样做,但在SQL中,我指的是像WHERE myfield NOT IN (1,2,3)这样的东西。

我希望能像下面这样在conditions数组中传递一个not子句,但这似乎是不可能的。

代码语言:javascript
复制
Item::all(array('conditions' => array('not' => array('myfield' => array(1,2,3))));

所以我的问题是,在锂中,这是可能的,而我忽略了这一点?如果不是,在我的模型中实现它的最接近锂的方式是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-16 20:34:31

只需过滤MongoDB即可轻松实现,如下所示:

代码语言:javascript
复制
Item::all(array('conditions' =>                                                                                                                                                                                
    array('myfield' => array(                                                                                                                                                                                  
        '$nin' => array(1,2,3)                                                                                                                                                                                 
    ))                                                                                                                                                                                                         
));                                                                                                                                                                                                            

如果这是你经常做的事情,你甚至可以为它创建一个自定义的查找器:

代码语言:javascript
复制
class MyModel extends \lithium\data\Model {                                                                                                                                                                    
    public static function __init()                                                                                                                                                                            
    {                                                                                                                                                                                                          
        parent::__init();                                                                                                                                                                                      

        static::finder('notin', function($self, $params, $chain) {                                                                                                                                             
            // Take all array keys that are not option keys
            $array = array_diff_key($params['options'],
                array_fill_keys(array('conditions', 'fields','order','limit','page'),0));
            // Clean up options leaving only what li3 expects
            $params['options'] = array_diff_key($params['options'], $array);
            $params['options']['conditions'] = array(
                'myfield' => array(
                    '$nin' => $array
                )
            );

            return $chain->next($self, $params, $chain);                                                                                                                                                       
        });                                                                                                                                                                                                    
    }                                                                                                                                                                                                          
}                                                                                                                                                                                                              

然后这样叫它:

代码语言:javascript
复制
MyModel::notin(array(1,2,3));                                                                                                                                                                                  

以同样的方式,您可以为MySQL源创建自定义查找器。

正如你可能看到的,如果你传递像array('fields'=>$array)这样的东西,这会产生一些问题,因为它会覆盖这个选项。发生的情况是,::notin() (通常是查找器)对(数组,空)签名有不同的行为。如果发生这种情况,它会认为第一个数组是options,查找器不接受任何参数。使用notin($array,array())会破坏前一个查找器,因为当传递真正的第二个参数(选项)时,第一个参数以$params['notin']结尾。

如果您在这里动态地混合数据源,我将创建一个不继承\ it \ data \ model的自定义模型,并委托它

添加到不同的模型,并基于最终模型数据源创建条件。

代码语言:javascript
复制
class MyFacadeModel {                                                                                                                                                                                          
    public static function byNotIn($conditions, $source) {                                                                                                                                                     
        return ($source == "mongodb")                                                                                                                                                                          
            ? $source::find( $rewrittenConditions)                                                                                                                                                             
            : $source::find( $rewrittenConditionsForMysql );                                                                                                                                                   
    }                                                                                                                                                                                                          
}

(代码可能有一点不正确,因为它大多取自我的头顶)

票数 6
EN

Stack Overflow用户

发布于 2011-02-18 14:10:59

为了方便起见,Lithium适配器支持大多数MongoDB比较运算符,因此对于Mongo或MySQL,您可以简单地编写如下查询:

代码语言:javascript
复制
Item::all(array('conditions' => array(
    'myfield' => array('!=' => array(1,2,3))                                                                                                                                                                                 
)));

它应该会给你你所期望的结果。对于MySQL,查询应如下所示:

代码语言:javascript
复制
SELECT * FROM items WHERE myfield NOT IN (1, 2, 3);

在Mongo中:

代码语言:javascript
复制
db.items.find({ myfield: { $nin: [1, 2, 3] }})
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5012378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档