【问题标题】:Yii findByAttributes() with greater than attribute.Yii findByAttributes() 具有大于属性。
【发布时间】:2011-11-10 23:20:56
【问题描述】:

我使用 Yii 已经有一段时间了,当我想从数据库中提取数据时,我通常只使用 findByAttributes。

$model=Auction::model()->findAllByAttributes(array('status'=>'1'));

或者类似的东西。

我的问题是,我将如何处理大于类型的情况?我试过了

$model=Auction::model()->findAllByAttributes(array('starttime'>=$date));

其中日期已被分配一个当前日期/时间设置,但这会导致错误。所以我的问题是我需要使用条件和/或参数吗?我应该在模型中做这种事情,或者使用 Criteria 或 CActiveDataProvider 的东西吗?

如果有人指出我正确的方向,我将不胜感激。我一直只是使用 findAll()s,但我知道它们是一种更好的方法。一些关于什么和何时使用属性、条件、参数等的一般信息也会很好。

我已阅读 Yii 文档并搜索了大量网站以寻找这些问题的答案,但我没有找到。

【问题讨论】:

  • 只是想指出array('status'=>'1')中那些字符串之间的=>是php的数组'key'=>'value'指针,而不是比较运算符.

标签: php attributes yii params conditional-statements


【解决方案1】:

即使使用 findByAttributes 也使用参数是个好主意,但这只会匹配。您可以使用 findAll 并添加条件语句,格式将与您已经在做的非常相似:

$model=Auction::model()->findAll(array(
    'condition'=>'status=:status AND starttime >= :date',
    'params'=>array(':status'=>1, ':date'=>$date),
));

如果您正在执行非常复杂的查询或以编程方式构建查询,您可能希望使用 findAllBySql 或 CDbConnection::createCommand 或 Query Builder,这取决于对您的应用最有意义的方式。

我会(重新)阅读Working with Databases 上的 Yii 部分,虽然它没有大量示例,但很清楚。那你可以试试 Yii 博客教程,Larry Ullman's tutorials

【讨论】:

  • datetime 相等检查很少是一个好主意(出于同样的原因,它对float 不利),最好使用不等式(... >= ... AND ...
  • params“好主意”是为了速度和安全性(温和的SQL 注射阻力)。
  • 好吧,这是有道理的。有点失落,但我现在明白了。
【解决方案2】:

findAllByAttributes 的第二个参数的类型是混合的,因此我们有(不是无限但)很多可能性,例如:

$model = Auction::model()->findAllByAttributes(
    array(
      'status' => 1
    ), 
    'starttime >= :date', 
    array(
        'date'=>$date
    )
));

$model = Auction::model()->findAllByAttributes(
    array(
      'status' => 1
    ), 
    array(
      'condition' => 'starttime >= :date'
      'params' => array('date'=>$date)
    )
));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2014-01-01
    • 1970-01-01
    • 2021-03-29
    • 2019-08-29
    相关资源
    最近更新 更多