codeigniter4 / codeigniter4/CodeIgniter4
[Model] Upsert problem with data validation, allowed fields, dates defined
- Linguagem predominante
- PHP
- Estrelas
- 6k
- Forks
- 2k
- Merge médio
- 1d 11h
- PRs com merge (30d)
- 73
Descrição
### PHP Version
7.4
### CodeIgniter4 Version
4.3.2
### CodeIgniter4 Installation Method
Composer (as dependency to an existing project)
### Which operating systems have you tested for this bug?
Windows, Linux
### Which server did you use?
apache
### Database
MySQL (ver. 8.0.28)
### What happened?
Upsert does not work correctly with the model.
Allowed fields, validation rules, dates (created_at, updated_at) are defined within the model, this does not apply to the query.
The model should throw validation errors first!
### Steps to Reproduce
```php
class TestModel extends BaseModel
{
protected $table = 'table';
protected $allowedFields = [
'item_id', 'item_quantity'
];
protected $validationRules = [
'item_id' => 'required|is_natural_no_zero',
'item_quantity' => 'required|numeric',
];
protected $useSoftDeletes = true;
protected $protectFields = true;
protected $useTimestamps = true;
}
$model = new TestModel();
$model->upsert([
'item_id' => "string data", //validation is not correct
'item_quantity' => 99, //everything ok
'col1' => "string data", //not in allowed fields
]);
//check validation errors
$model->errors();
$model->db->getLastQuery()->getQuery();
```
### Expected Output
```sql
INSERT INTO `table` (`item_quantity`, `created_at`, `updated_at`)
VALUES (99, unix_timestamp, unix_timestamp)
ON DUPLICATE KEY UPDATE
`table`.`item_quantity` = VALUES(`item_quantity`),
`table`.`updated_at` = VALUES(`updated_at`)
```
### Anything else?
_No response_
Guia de contribuição
Direção de pesquisa
Reproduza o comportamento com o TestModel mostrado, sua chamada de upsert e a configuração do MySQL; em seguida, rastreie como upsert trata a validação, os campos permitidos, as exclusões lógicas e os timestamps. Está concluído quando dados inválidos produzem erros de validação antes da consulta, campos não permitidos são excluídos e o SQL gerado corresponde à saída esperada.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- mysql, php
- Domínio
- backend, databases
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Razoavelmente clara
- Facilidade para iniciantes
- 35/100