Will Daniels
Will Daniels

Reputation: 125

The wrong record in my database is getting updated

im using laravel eloquent to update a record in a database table. Im passing in a parameter of 52 which is the id of the record I want to update (primary key).

I am printing the query to check which record its finding and its printing the record with the id of 13 and then when i check the table, id 13 has been updated.

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();
    }
}

Upvotes: 1

Views: 90

Answers (2)

Will Daniels
Will Daniels

Reputation: 125

I have managed to fix this by just adding a select at the start

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

It seems it was getting the right row, but displaying the id as something else. When I took out the join and the joins where clause, it worked. I suspect it was using the id of the joint row from the todoTypes table as that was 13.

Upvotes: 1

naamhierzo
naamhierzo

Reputation: 430

How about trying like this?

The query after using find did not make any sense since find returns the first object not a query builder instance.

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();
    }
}

Upvotes: 2

Related Questions