【问题标题】:Filter MySQL return by date range按日期范围过滤 MySQL 返回
【发布时间】:2017-04-17 21:36:06
【问题描述】:

我需要修改此对象以仅返回过去 100 天的条目,但我们没有每天的条目,因此我们需要更复杂的东西来过滤掉额外的日期。

当前对象:

$obj = YearToDate::get()->sort('ID', 'DESC')->limit(100);

是否可以在对象定义中按创建日期进行过滤?还是我需要创建一个函数来处理过滤?

这是课程:

class YearToDate extends DataObject {

// Create DB fields
private static $db = array(
    'Inches' => 'Text'
);

// Assign Weather to Weather
private static $belongs_many_many = array(
    'Weather' => 'Weather'
);

// Summary fields to show in gridfield
private static $summary_fields = array(
    'Created' => 'Date',
    'Inches' => 'Inches'
);

public function getCMSFields() {
    $fields = parent::getCMSFields();

    // Remove Fields
    $fields->removeByName('Weather');

    // Add DB fields to CMS tabs
    $fields->addFieldToTab('Root.Main', new TextField('Inches','Inches'));

    return $fields;
}

// Required Fields
function getCMSValidator() {
    return new RequiredFields(array('Inches'));
}

}

【问题讨论】:

  • 请添加您正在使用的数据库库(ORM/Query builder)。
  • 如果YearToDate 是一个类,你必须发布代码。
  • 我们这里缺少 ORM 吗?
  • 添加了类,它是 SilverStripe 的 ORM
  • get()、sort() 和 limit() 在哪里?

标签: php mysql database silverstripe


【解决方案1】:

如果您使用 MySQL 作为底层 RDBMS,您可以使用 MySQL date functions 查询过去 100 天的条目。

这样的事情应该可以工作:

$list = YearToDate::get()
    ->sort('Created', 'DESC')
    ->where('"Created" >= DATE_SUB(NOW(), INTERVAL 100 DAY)')

因此,它的作用是从当前时间 (NOW()) 中删除 100 天,并将其与 Created 日期进行比较。如果Created 更大,那么它的历史不到 100 天。

这将严格过滤过去 100 天,因此如果您每天没有一个条目或每天没有多个条目,您可能会得到少于或多于 100 个结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多