Složené klíče
Na složené klíče jste již také trochu narazili v kapitole o definicích. Pojmem složené klíče se myslí to samé co v SQL. Tedy jedná se o klíče vytvořené nad více sloupečky - v našem případě tedy nad více vlastnostmi entity.
Existuje situace, kdy je složený klíč definován automaticky a to již z podstaty věci. Pokud má entita více vlastností označených jako ID vlastnosti, tak se z těchto vlastností automaticky stává primární složený klíč. Ukažme si takovou situaci názorně a opět sáhněme po kousku ukázkové aplikace. Konkrétně si připomeneme ukázkovou třídu JetApplication\Content_Article_Localized reprezentující lokalizovanou verzi článku. Ta má dvě vlastnosti označené jako identifikační:
#[DataModel_Definition(
A když se kouknete jak je vytvořena databázová tabulka, tak najdete primární klíč nad těmito dvěma sloupci. To je v praxi nejčastější situace kdy se operuje se složenými klíči a není pro definici třeba nic dalšího dělat.
type: DataModel::TYPE_ID,
is_id: true, //*** !!! ***
related_to: 'main.id',
do_not_export: true
)]
protected string|null $article_id = '';
#[DataModel_Definition(
type: DataModel::TYPE_LOCALE,
is_id: true, //*** !!! ***
do_not_export: true
)]
protected Locale|null $locale;
No jo, ale co když z nějakého důvodu potřebujeme vytvořit složený klíč nad vlastnostmi, které nejsou označené jako identifikační? A co když navíc potřebujeme, aby takový klíč nebyl primární (přeci jen ten je vyhrazen právě pro identifikaci záznamu), ale třeba unikátní, nebo naopak běžný index? Řešení je si takový klíč definovat extra. Pochopitelně můžete si to "naklikat" v rámci Jet Studia, ale ukažme si jak vypadá definice takového složeného klíče, která je součástí atributů třídy:
namespace JetApplicationModule\Test\ORM;
use Jet\DataModel;
use Jet\DataModel_Definition;
use Jet\DataModel_Query;
use Jet\DataModel_IDController_UniqueString;
#[DataModel_Definition(
name: 'model_c1',
database_table_name: 'model_c1',
id_controller_class: DataModel_IDController_UniqueString::class,
id_controller_options: [
'id_property_name' => 'id'
],
key: [
'name' => 'my_key',
'property_names' => [
'id',
'text'
],
'type' => DataModel::KEY_TYPE_INDEX
]
)]
class Model_C1 extends DataModel
{
//... ... ...
}
Tedy definice složeného klíče je součástí definice třídy a takto definovaných složených klíčů může být víc - ne pouze jeden, jak je uvedeno v příkladu.
Definice se skládá z těchto částí:
- name
Název složeného klíče. - property_names
Názvy vlastností ze kterých se klíč skládá. - type
Typ klíče.
- DataModel::KEY_TYPE_PRIMARY
- DataModel::KEY_TYPE_UNIQUE
- DataModel::KEY_TYPE_INDEX