Autor Zpráva
Serg
Profil
Ahoj, co si myslíte o používání konstant pro názvy sloupců?
Tedy že by byla třída pro danou tabulku a měla v sobě konstanty názvů sloupců.

$columns = array(
  "username",
  "first_name",
  "last_name",
  "email"
);
$filter = array("group_id" => 3);
$users = Users::getRows($filter, $columns);

VS

$columns = array(
  Users::USERNAME,
  Users::FIRST_NAME,
  Users::LAST_NAME,
  Users::EMAIL
);
$filter = array(Users::GROUP_ID => 3);
$users = Users::getRows($filter, $columns);

Nebo je to zbytečné a v php to žádnou výhodu to mít nebude?
N71
Profil *
Je to trochu divná konvence. Většinou se pro sloupce používají vlastnosti s definovaným datovým typem.
Serg
Profil
Myslíš něco jako:
$user = new User();
$user->username = "franta1";
$user->group_id = 3;
?

Jak se potom řeší třeba filtrování, a další práce s kolekcí sloupců, např. kdybych chtěl mít třídu na vytvoření html tabulky podle obdržené sady dat a seznamu sloupců, který řekne které sloupce a v jakém pořadí má číst z té sady dat?
blaaablaaa
Profil
Serg:
Pak si systém může z information_schema.columns vytáhnout datové typy
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='databaze' AND TABLE_NAME = 'tabulka'

Případně si to může vyčíst z třídy.
Keeehi
Profil
Serg:
Jak se potom řeší třeba filtrování, a další práce s kolekcí sloupců, např. kdybych chtěl mít třídu na vytvoření html tabulky podle obdržené sady dat a seznamu sloupců, který řekne které sloupce a v jakém pořadí má číst z té sady dat?
Každý systém to nějak řeší. Není to raketová věda ale zase to není tak triviální aby se mi to tu chtělo popisovat. Nicméně, když už chceš ORM požívat vyber si něco hotového a to ve tvém projektu použij. Psát si to sám nechceš. Pro příklad, Nextras ORM má cca 10 000 řádek kódu, Doctrine ORM 100 000, Propel 90 000, a tak dále. Není to něco co vytvoříš za hoďku dvě.
Beavis
Profil
Serg:
Stará Symfony měla konvenci, že na základě schématu vygenerovala nějaké BasePeery, které držely právě názvy sloupců jako konstanty a do nich sis mohl např. napsat statické funkce, které se daly používat jako jakési helpery.
Dnes už archaické, ale jakž takž to fungovalo.

<?php

// ArticlePeer.class.php extends BaseArticlePeer

public static function retrieveById(int $id): ?Article
{
  $c = new Criteria();
  $c->add(self::ID, $id);
  
  return self::doSelectOne($c);
}
Serg
Profil
Mně spíš hlavně zajímalo jestli je zvykem používat konstanty místo samotného řetězce, pokud se bude ten řetězec používat v kódu na více místech. Konstanty tak trochu chrání před překlepy, za 1) může lepší editor už při psaní napovídat existující konstanty a pak, když je překlep v konstantě (třídy), tak to vygeneruje Fatal error, zatímco překlep ve stringu ne, a déle se pak hledá chyba. Na druhou stranu je to o trochu víc práce.

Kouknul jsem na ty ORM knihovny, ale nikde jsem právě neviděl že by se tam pracovalo s názvy sloupců jako ukazately.
Já jsem si právě zvykl předat pomocné třídě např. na vytváření formulářových polí objekt modelu, který má metodu na vrácení dat v asociativním poli, a potom vytvářet jednotlivá fomrulářová pole s použitím názvů sloupců jako ukazatelů - potom při ukládání není potřeba nic extra přemapovávat.
Např.
<?= $form->renderInput(User::USERNAME /nebo/ "username"); ?>
Vlastně ani nevím, jak jinak by to šlo udělat, jakože pomocí těch vlastností jak říkal N71.
Keeehi
Profil
Pokud ti jde o konvenci tak ty sloupce jsou atributy třídy. Tak jak to máš v [#3]. Samozřejmě pokud chceš, dá se k tomu přistupovat dynamicky
$user = new User();
foreach($_POST['form'] as $name => $value) {
    $user->$name = $value;
}

Nebo naopak transformovat ten objekt na pole (pokud to potřebuješ)
class User {
    function asArray() {
        return (array)$this;
    }
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0