Вызов неопределенного метода Illuminate \ Database \ Eloquent \ Builder :: save () при выполнении команды расписания задач Laravel - PullRequest
3 голосов
/ 18 февраля 2020

Я пытаюсь запланировать кампанию, которая запускается, когда

subendsat больше или равно текущему времени

subendsat - это столбец в таблице пользователя

В моих командах у меня есть это

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\User;
use Carbon\Carbon;

class ChangeRole extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:update';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'This Changes Role When The Subscription Expires';

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

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
        $user = User::where('subendsat', '>=', Carbon::now())->get();
        $user->role = 'subscriber';
        $user->save();

    }
}

В моем ядре у меня есть

protected $commands = [
    //
    'App\Console\Commands\ChangeRole',
];

/**
 * Define the application's command schedule.
 *
 * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
 * @return void
 */
protected function schedule(Schedule $schedule)
{
     $schedule->command('command:update')
              ->daily();
}

Я создаю базовую c задачу, подобную этой, в windows У меня есть этот inmy .bat файл

c: \ xampp \ php \ php .exe кустарное расписание: запустить 1 >> NUL 2> & 1

  1. Go до Windows Планировщик задач
  2. Нажмите кнопку Создать базовую задачу c, выберите Когда я войду в систему, а затем выберите Запуск программа -> ваш .bat файл.
  3. Установите флажок Открыть диалоговое окно свойств и нажмите Fini sh.
  4. В свойствах задачи нажмите «Триггеры», затем нажмите «Новый» и добавьте новый триггер. Повторять задачу каждые - 1 минута.

Но когда я запускаю команду

php команда ремесленника: обновление, возвращается ошибка

Вызов неопределенного метода Illuminate \ Database \ Eloquent \ Builder :: save ()

Но это не обновляет мою базу данных при ее запуске. Я не знаю, что я делаю. Может кто-нибудь посоветовать? спасибо.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Код, который вы опубликовали, не выдаст эту ошибку ... У вас нет экземпляра класса Builder, так как ->get() возвращает Collection. Но независимо от того, изменение свойства Collection через $user->role = 'subscriber'; недопустимо ... Вам нужно l oop сверх $users ( правильно назвать ваши переменные ) и обновлять каждый $user:

$users = User::where('subendsat', '>=', Carbon::now())->get();
foreach ($users as $user) {
  $user->role = 'subscriber';
  $user->save();
}

Или вызвать партию update():

User::where('subendsat', '>=', Carbon::now())->update([
  'role' => 'subscriber'
]);
1 голос
/ 18 февраля 2020

Да, потому что вы возвращаете коллекцию, а не одну запись.

Вы можете массово обновить свои записи:

User::update(['role' => 'subscriber'])
      ->where('subendsat', '>=', Carbon::now());

Но я думаю, что вы не можете сделать это, вам нужно обновить поле role_id:

$roleSubscriber = Role::where('name', 'subscriber')->first();

User::update(['role_id' => $role->getKey()])
      ->where('subendsat', '>=', Carbon::now());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...