Я использую 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();
}
}
Я обновил его, чтобы показать модель. Даже когда я делаю то, что вы сказали, он получает запись с идентификатором 13, я просто пытался добавить в начале `` выбор '', а затем он получает правильный идентификатор, очень странно
Вы пробовали использовать where ('id', 52) -> get () -> first () вместо -> find (52)? Когда вы вызываете такие методы, как join или select, возвращается экземпляр QueryBuilder на основе вашей модели. Я считаю, что ваша проблема здесь.
Да, я пробовал это, и это дает тот же результат. Я обнаружил, что идентификатор всегда равен 13 независимо от того, что я выбираю, но другая информация верна, поэтому я думаю, что с соединением что-то не так. Если я возьму где и присоединюсь, это сработает






Как насчет такой попытки?
Запрос после использования 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();
}
}
Хороший. Я думал, что использование find - не лучший способ, но ваш snnipet хорош.
По-прежнему дает тот же результат, я пробовал много разных идентификаторов, и все они возвращают идентификатор 13, но другие поля таблицы соответствуют правильному идентификатору. Думаю, проблема как-то связана с объединением. Если я возьму туда где и присоединюсь, это сработает
@WillDaniels Для лучшей отладки вы можете показать, что возвращает метод toSql()? (назовите его перед -> find (52)) он превратит запрос в необработанную строку sql.
@naamhierzo я сделал это, и он дал правильный результат, когда я вставил запрос в свою базу данных.
Мне удалось это исправить, просто добавив выбор в начале
select('todo.id', 'todo.completedDate')
Кажется, что он получил правильную строку, но отображал идентификатор как что-то еще. Когда я вынул предложение join и joins where, это сработало. Я подозреваю, что он использовал идентификатор объединенной строки из таблицы todoTypes, так как это было 13.
Пожалуйста, вставьте свой класс модели для лучшего понимания. На первый взгляд я вижу, что вы используете метод find в построителе запросов. Я считаю, что лучший подход - использовать -> where ('id', 52) -> get () -> first ().