robsonvleite / datalayer

The data layer is a persistent abstraction component of your database that PDO (O data layer é um componente para abstração de persistência no seu banco de dados que usa PDO com prepared statements)
https://www.upinside.com.br
MIT License
144 stars 53 forks source link

Conflito ? #71

Open wilianmaique opened 1 year ago

wilianmaique commented 1 year ago

tenho essas 2 tabelas. (extrai elas com php my admin)

CREATE TABLE `level_system` (
 `id` int NOT NULL AUTO_INCREMENT,
 `id_reg` int NOT NULL,
 `xp` int DEFAULT '0',
 `level` int DEFAULT '1',
 PRIMARY KEY (`id`),
 KEY `fk_level_system_users` (`id_reg`),
 CONSTRAINT `fk_level_system_users` FOREIGN KEY (`id_reg`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
`CREATE TABLE `rank_system` (
 `id` int NOT NULL AUTO_INCREMENT,
 `id_reg` int NOT NULL,
 `server_id` int NOT NULL,
 `state` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'SP',
 `level` int DEFAULT '0',
 `rank` int DEFAULT '0',
 `exp` int DEFAULT '0',
 `skill` float DEFAULT '100',
 `knife_deathby` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT 'N/A',
 `kills_total` int DEFAULT '0',
 `kills_knife` int DEFAULT '0',
 `kills_death_knife` int DEFAULT '0',
 `kills_grenade` int DEFAULT '0',
 `kills_hs` int DEFAULT '0',
 `total_death` int DEFAULT '0',
 `wpn_kills` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '0',
 `total_assist` int DEFAULT '0',
 `time_played` int DEFAULT '0',
 `total_points_skill` int DEFAULT '0',
 `hosts_saves` int DEFAULT '0',
 `rounds_win` int DEFAULT '0',
 `rounds_lose` int DEFAULT '0',
 `games_mix_win` int DEFAULT '0',
 `rounds_mvp` int DEFAULT '0',
 PRIMARY KEY (`id`),
 KEY `fk_rank_system_users` (`id_reg`),
 KEY `fk_rank_system_servers` (`server_id`),
 CONSTRAINT `fk_rank_system_servers` FOREIGN KEY (`server_id`) REFERENCES `servers` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
 CONSTRAINT `fk_rank_system_users` FOREIGN KEY (`id_reg`) REFERENCES `users` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`

e essas 2 classes, em arquivos diferentes....

class RankSystem extends DataLayer
{
    public function __construct()
    {
        parent::__construct("rank_system", ["id_reg", "server_id"], 'id_reg', false);
    }
}
class LevelSystem extends DataLayer
{
public function __construct()
    {
        parent::__construct("level_system", ["id_reg"], 'id_reg', false);
    }
}

o problema é que a LevelSystem funciona normalmente com 'id_reg' definido como primario, já RankSystem não funciona com 'id_reg' como primario. só com id

quando tento inserir um registro em RankSystem o erro dispara:

$rank = new RankSystem();
    $rank->id_reg = 1;
    $rank->server_id = 1;
    $rank->save();
 Fatal error: Uncaught Error: Call to a member function data() on null in C:\WampServer\www\phoenixkiller\vendor\coffeecode\datalayer\src\DataLayer.php on line 313

oque pode estar acontecendo, por que uma classe funciona e outra não.

robsonvleite commented 1 year ago

Note que o terceiro parâmetros do construtor é o id primário de sua tabela.

No seu setup você informa id_red em ambas as classes, mesmo uma delas sendo id.

wilianmaique commented 1 year ago

Note que o terceiro parâmetros do construtor é o id primário de sua tabela.

  • Quando esse campo é nomeado com id, emita ele no construtor.
  • Quando o campo não tiver o nome de id, informe o nome do campo primário.

No seu setup você informa id_red em ambas as classes, mesmo uma delas sendo id.

confesso que não entendi, por que uma classe funciona com o campo 'id_reg' definido no construtor, mas a outra classe n

mas em fim, deixa pra la, vou utilizar o metodo find mesmo, e deixar id como primario, eu só queria utilizar find by id com a id direto do 'jogador' pra n precisar usar find etc

robsonvleite commented 1 year ago

O terceiro parâmetro serve para indicar a classe qual é o campo primário com auto incremento da sua tabela.

Quando você informa id_reg no terceiro parâmetro e tem uma classe onde id é primário, você gera um esse erro. E é exatamente o que está acontecendo.