Я использую Laravel Eloquent для обновления записи в таблице базы данных. Я передаю параметр 52, который является идентификатором записи, которую я хочу обновить (первичный ключ).
Я печатаю запрос, чтобы проверить, какая запись его нахождения и печатает ли запись с идентификатором 13, а затем, когда я проверяю таблицу, идентификатор 13 был обновлен.
protected $connection = 'sqlsrv';
protected $table = 'todo';
public $timestamps = false;
public static function complete($todoId, $userId)
{
$now = new DateTime();
$query = Self::join('todoTypes', 'todo.typeId', 'todoTypes.id')
->where('todoTypes.canComplete', 1)
->whereNull('todo.completedDate')
->find(52);
$query->where(function ($query) use ($now)
{
$query->whereNull('cancelDate')
->orWhere('cancelDate', '>', $now);
});
if ($query)
{
$query->completedDate = $now;
$query->save();
}
}
Как насчет того, чтобы пытаться так?
Запрос после использования find не имеет никакого смысла, так как find возвращает первый объект, а не экземпляр построителя запросов.
public static function complete($todoId, $userId)
{
$now = new DateTime();
$object = Self::join('todoTypes', 'todo.typeId', 'todoTypes.id')
->where('todoTypes.canComplete', 1)
->whereNull('todo.completedDate')
->where(function ($query) use ($now) {
$query->whereNull('cancelDate')
->orWhere('cancelDate', '>', $now);
})->find(52);
if ($object) {
$object->completedDate = $now;
$object->save();
}
}
Мне удалось это исправить, просто добавив выбор в начале
select('todo.id', 'todo.completedDate')
Кажется, он получал правильный ряд, но отображал идентификатор как что-то еще.
Когда я вынул соединение и пункт где присоединяются, это сработало. Я подозреваю, что он использовал идентификатор объединенной строки из таблицы todoTypes, поскольку это было 13.