使用limit(20)它只运行DB的前20个值

时间:2015-03-17 15:17:08

标签: php mysql database drupal drupal-7

在这行代码中,它只选择前20个但我希望第一次选择前20个,然后选择另一个和其他,依此类推:'( 我怎么能解决这个问题?

function something_cron()
  $query = db_select('watchdog', 'wa')
    ->extend('PagerDefault')
    ->orderBy('wid')
    ->fields('wa', array('variables', 'type', 'severity',
  'message', 'wid', 'timestamp'))
    ->limit(20);
  $result = $query->execute();

  // Loop through each item and add to $row.
  foreach ($result as $row) {
    someother();
  }

我也想避免这个PagerDefault,但我不能......

2 个答案:

答案 0 :(得分:1)

首次尝试时尝试:

$query = db_select('watchdog', 'wa')
->extend('PagerDefault')
->orderBy('wid')
->fields('wa', array('variables', 'type', 'severity','message', 'wid', 'timestamp'))
->range(0,20);
$result = $query->execute();

这是第二次

$query = db_select('watchdog', 'wa')
->extend('PagerDefault')
->orderBy('wid')
->fields('wa', array('variables', 'type', 'severity','message', 'wid', 'timestamp'))
->range(20,20);
$result = $query->execute();

只需继续增加范围函数的第一个参数。

“偏移”的作用是忽略前x行的数量。如果你有100行而你想要最后35行你可以做“ - >范围(65,35);”

编辑: 以下是range()的工作原理。

http://unska.com/drupal_range.png

答案 1 :(得分:1)

首先,如果您没有显示寻呼机,则不需要PagerDefault。如果没有它,您可以使用orderByrange

如果我理解你的帖子,每次运行cron时,你都需要看门狗表的前20行。如果是这种情况,我建议跟踪你从表中获得的最后一个看门狗ID(wid)并将其用于每次后续运行。类似的东西:

$wid = variable_get('my_last_wid', 0);

$result = db_select('watchdog')
  ->fields('watchdog', array('variables', 'type', 'severity', 'message', 'wid', 'timestamp'))
  ->condition('wid', $wid, '>')
  ->orderBy('wid')
  ->range(0, 20)
  ->execute();

foreach ($result as $watchdog) {
  // do whatever you need to do
}

if (!empty($watchdog)) {
  variable_set('my_last_wid', $watchdog->wid);
}