Ok, after almost completely pulling my hair out; I found the problem where Eloquent is setting:
protected $primaryKey = 'id';
which is used on the update method and returned by getKeyName().
protected function setKeysForSaveQuery(Builder $query)
{
$query->where($this->getKeyName(), '=', $this->getKeyForSaveQuery());
return $query;
}
I then realised my 'id' on the tale was uppercase and not lower case!
I guess that means my answer is that I need to ensure I am using lowercase 'id' for the primary key or overriding it on the Model
protected $primaryKey = 'ID';