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(
    
typeDataModel::TYPE_ID,
    
is_idtrue//*** !!! ***
    
related_to'main.id',
    
do_not_exporttrue
)]
protected 
string|null $article_id '';

#[
DataModel_Definition(
    
typeDataModel::TYPE_LOCALE,
    
is_idtrue//*** !!! ***
    
do_not_exporttrue
)]
protected 
Locale|null $locale;
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.

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_classDataModel_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.
Typ klíče může být:
  • DataModel::KEY_TYPE_PRIMARY
  • DataModel::KEY_TYPE_UNIQUE
  • DataModel::KEY_TYPE_INDEX

Předchozí kapitola
Vnější relace
Další kapitola
Události