Обновляется неправильная запись в моей базе данных

Я использую 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 в построителе запросов. Я считаю, что лучший подход - использовать -> where ('id', 52) -> get () -> first ().

Fábio Nunes 20.12.2018 11:24

Я обновил его, чтобы показать модель. Даже когда я делаю то, что вы сказали, он получает запись с идентификатором 13, я просто пытался добавить в начале `` выбор '', а затем он получает правильный идентификатор, очень странно

Will Daniels 20.12.2018 11:27

Вы пробовали использовать where ('id', 52) -> get () -> first () вместо -> find (52)? Когда вы вызываете такие методы, как join или select, возвращается экземпляр QueryBuilder на основе вашей модели. Я считаю, что ваша проблема здесь.

Fábio Nunes 20.12.2018 11:30

Да, я пробовал это, и это дает тот же результат. Я обнаружил, что идентификатор всегда равен 13 независимо от того, что я выбираю, но другая информация верна, поэтому я думаю, что с соединением что-то не так. Если я возьму где и присоединюсь, это сработает

Will Daniels 20.12.2018 11:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
58
2

Ответы 2

Как насчет такой попытки?

Запрос после использования 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 хорош.

Fábio Nunes 20.12.2018 11:34

По-прежнему дает тот же результат, я пробовал много разных идентификаторов, и все они возвращают идентификатор 13, но другие поля таблицы соответствуют правильному идентификатору. Думаю, проблема как-то связана с объединением. Если я возьму туда где и присоединюсь, это сработает

Will Daniels 20.12.2018 11:36

@WillDaniels Для лучшей отладки вы можете показать, что возвращает метод toSql()? (назовите его перед -> find (52)) он превратит запрос в необработанную строку sql.

naamhierzo 20.12.2018 11:47

@naamhierzo я сделал это, и он дал правильный результат, когда я вставил запрос в свою базу данных.

Will Daniels 20.12.2018 11:51

Мне удалось это исправить, просто добавив выбор в начале

select('todo.id', 'todo.completedDate')

Кажется, что он получил правильную строку, но отображал идентификатор как что-то еще. Когда я вынул предложение join и joins where, это сработало. Я подозреваю, что он использовал идентификатор объединенной строки из таблицы todoTypes, так как это было 13.

Другие вопросы по теме