ActiveRecord支持以下语法吗?

在看ActiveRecord,定义Criteria从condition、select、group、having、limit等出发,定义各种sql,的确是一个途径,但是否过于简单?很多情况下,似乎还是需要自己去拼sql,例如在kevinkorb的博客中(http://www.kevinkorb.com/post/26)提到如下例子:


$price_low = 1000;

$price_high = 5000;

 

$Products = Product::model()

    ->with(array('brand'))

    ->findAll("price > :price_low AND price < :price_high", array (

        ':price_low' => $price_low,

        ':price_high' => $price_high )

    )

);

 

这种语法实际上并没有对DB操作进行封装,用PHP的数据结构来避免拼接sql,比如我想要一个查询:

select * from table where col1=2 or col1=3 or col1=4;

没错,就是想要有in的功能,我是否需要自己写好col1 in ($str_ids)

而这里的$str_ids需要我来自己拼接呢?

Perl中有SQL::Abstract类,基本上将需要自己拼sql的地方都用perl数据结构表达了,以上情况可以用:


    my %where = (

       requestor => 'inna',

       worker => ['nwiger', 'rcwe', 'sfz'],

       status => { '!=', 'completed' }

    );


    my($stmt, @bind) = $sql->select('tickets', '*', \%where);

生成的SQL为:


    $stmt = "SELECT * FROM tickets WHERE

                ( requestor = ? ) AND ( status != ? )

                AND ( worker = ? OR worker = ? OR worker = ? )";

    @bind = ('inna', 'completed', 'nwiger', 'rcwe', 'sfz');

也可以用in语法:


    my %where  = (

        status   => 'completed',

        reportid => { -in => [567, 2335, 2] }

    );


#Which would generate:


    $stmt = "WHERE status = ? AND reportid IN (?,?,?)";

    @bind = ('completed', '567', '2335', '2');

AR中是否有类似的功能呢?

看CDbCriteria.php源码,了解到从1.0.10开始提供了AddInCondition函数,添加In条件,默认AND关系,不过这个函数只能在原有的Criteria对象上调用来添加In条件吗?是否可以某种形式在构造函数中书写?

CDbCriteria 貌似是如果你要使用 Addxxx 的话,必须先提供一个 conditions,然后在此基础上 Add,不过确实有很多情况下,我们只有一个条件。但也想使用一种便捷的办法。

不过也不一定先要构建 CDBCriteria,你可以使用类似的语句 Model::model()->findAll(array(‘conditions’ => ‘??’));

不是很明白你的意思,不过看findAllByAttributes的源码,发现Yii的包装还是可以的,上面说到的用法,可以这样实现:




$brands = Brand::model()->findAllByAttributes(array('parent_id'=>array(1,2,3)));

#sql built:

select * from brand where parent_id in (1,2,3);



看源码也发现,如果指定某个attribute为null,生成的sql会转为where column is null,已经ok了。

Yii刚刚起步,文档中的例子少了一些,有空我写一些常见用例出来分享吧