2013-12-15 5 views
2

Моего сценарий:Laravel Красноречивого Model Properties

PHP скрипт 1:

$user = User::find(1); 
$user->email = '[email protected]'; 
$user->save(); 

PHP Script 2:

$user = User::find(1); 
while ($user->email != '[email protected]') { 

    /** Do stuff **/ 

} 

Теперь мой вопрос, имеет ли переменное электронную почту обновляются, когда это обновлен из другого скрипта? Например, сценарий 2 запускается, пока он запускается, также запускается Script 1. Будет ли обновление while обновляться и перемещаться, поскольку условие больше не соответствует действительности?

+4

Если сценарий 2 оставлен включенным, то в настоящее время он не будет получать изменения, сделанные сценарием 1. Это происходит потому, что 'User :: find()' выполняется за пределами цикла и не читается снова. Скопируйте это внутри цикла (вам это нужно, где оно также), а затем 'sleep (5);' поэтому вы не носите свою базу данных. Тогда это должно сработать. – halfer

+1

Итак, вам нужно снова начать занятия? Спасибо, это то, что я искал. Не был уверен, что это было необходимо. – Martijn

+1

Вы можете использовать блокировку. http://laravel.com/docs/queries#pessimistic-locking – Anam

ответ

1

Я думаю, что самый простой способ добиться чего-то подобного - запустить запрос каждую минуту или около того, проверяя обновленные столбцы. Альтернативой было бы заставить вашего демона запустить какой-то сервер, который получает pinged с помощью модельного события.

Если вам нужно только отслеживать однопользовательский адрес электронной почты, это достаточно просто - User::find($id);, затем sleep(60). Если вам нужно контролировать более одного пользователя, это становится немного сложнее.

Если ваша модель использует временные метки (created_at и updated_at), можно запросить только те модели, которые были обновлены в последнее время. Предположим, вы хотите повторно запросить базу данных каждые 60 секунд - мы хотим запросить все пользовательские модели, у которых есть update_at больше, чем 60 секунд назад.

Я буду использовать класс Carbon, который является расширением DateTime, включенным в Laravel, но вы также можете создать обычный объект DateTime или строку datetime вручную.

$dt = Carbon\Carbon::now()->subSeconds(60); 
$users = User::where('updated_at', '>=', $dt) 
    ->get(); 

foreach ($users as $user) { 
    // do something with users that have been updated 
} 

sleep(60); 

Вы также можете заменить get() с lists('email'), если вы хотите только плоский массив писем обновленных пользователей.

Также могут быть более эффективные способы, чем использование sleep(60), возможно, с использованием класса процессов Symfony, но я не буду вдаваться в это.

Смежные вопросы