选择现在具有日期的所有行

时间:2013-10-10 19:00:27

标签: php mysql laravel laravel-4

我需要创建一个每分钟运行一次的cron作业,并在mysql数据库中搜索所有行,这些行的日期字段等于当前日期和时间四舍五入到分钟。

我的问题是什么是正确的查询,也许是存储活动日期的最佳方式。

这里的基本用例是我已经安排了活动,我需要在这些活动安排的确切时间发送通知。这似乎是一件很常见的事情,但我无法弄清楚这是否是最佳方法。

提前致谢。

2 个答案:

答案 0 :(得分:1)

为您的计划程序创建一个artisan命令:

file:app / commands / CheckSchedule.php

use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;

class CheckScheduleCommand extends Command {

    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'check:schedule';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Process scheduled messages.';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct(Scheduler $scheduler)
    {
        parent::__construct();

        $this->scheduler = $scheduler;
    }

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function fire()
    {
        $this->scheduler->check();
    }

}

告诉Artisan加载命令编辑文件app \ start \ artisan.php并添加:

Artisan::resolve('CheckScheduleCommand');

创建一个Scheduler类:

class Scheduler {

    public function check()
    {
        $date = \Carbon\Carbon::now();

        // set the seconds to 59 to get the 'whole' minute in the
        $date->second = 59;

        /// this filter will get every notification not sent from now to the past
        /// If your server got slow or something like that people will still be notified
        $notifications = Schedule::where('notify_at','<=',$date)->where('notified',false)->get();

        foreach($notifications as $notification)
        {
            $this->notify($notification);
        }
    }

    public function notify($notification)
    {
        /// do whatever you need here to notify your user;

        $notification->notified = true;
        $notification->save();
    }

}

然后通过运行

进行测试
php artisan check:schedule

你可以每分钟使用cron

* * * * * /path/to/php /var/www/project/artisan check:schedule

关于您的日期字段,您最好使用时间戳,更容易过滤,您可以使用acessors和mutators使人们友好地使用它并仍然将其存储为时间戳:http://laravel.com/docs/eloquent#accessors-and-mutators

答案 1 :(得分:0)

也许你需要稍微改变逻辑。

你可以让它变得更容易,只需实现这一块查询:

... WHERE date_field <= CURRENT_TIMESTAMP() AND processed = 0;
注意我已经使用过CURRENT_TIMESTAMP()函数,因为它的查询速度很快,如果你把日期存储为INTEGER类型字段中的unix时间戳,那就会很快