Dropdown di Relazione
Trasforma una colonna di chiave esterna grezza in un dropdown, una combobox con ricerca, o una selezione multipla risolta rispetto a un'altra tabella con relation().
Cosa fa relation()
relation() collega una colonna reale e modificabile della tabella corrente (ad es. payments.customerNumber) a una ricerca (lookup) su un'altra tabella. Il modulo di creazione/modifica mostra un dropdown con le righe di quella tabella invece di un semplice campo numerico per l'id, e l'elenco mostra il nome risolto al posto dell'id grezzo.
$xcrud->relation(
'customerNumber', 'customers', 'customerNumber', 'customerName',
"country = 'USA'", null, false, ' ', null, null, null, true
);
La tabella di destinazione deve essere raggiungibile allo stesso modo di qualsiasi altra tabella del sito - una tabella reale, non in blacklist, con una chiave primaria a colonna singola. Non ha bisogno di una propria pagina CRUD; relation() può leggere una tabella che nient'altro nel sito consulta mai direttamente.
Parametri
| Parametro | Tipo | Predefinito | Descrizione |
|---|---|---|---|
$field | string | - | La colonna reale e modificabile di questa tabella da collegare (ad es. customerNumber). |
$targetTable | string | - | La tabella in cui cercare i valori. |
$targetId | string | - | Colonna di $targetTable il cui valore viene salvato in $field. |
$targetName | string|array | - | Colonna/e mostrata/e come etichetta dell'opzione. Un array (ad es. ['contactFirstName', 'contactLastName']) viene unito con $concatSeparator per mostrare qualcosa come "Nome Cognome". |
$where | array|string|null | null | Restringe quali righe di destinazione vengono proposte. Un array è un'uguaglianza colonna=>valore sicura, unita con AND e passata come parametro. Una stringa è SQL grezzo fidato, scritto dallo sviluppatore (stesso livello di fiducia di where_raw()), opzionalmente con segnaposto {field} sostituiti con il valore proprio della riga corrente. |
$orderBy | string|null | null | Ordinamento dell'elenco delle opzioni. |
$multi | bool | false | Renderizza una selezione multipla invece di un singolo dropdown; il valore salvato diventa un elenco di id separati da virgola. |
$concatSeparator | string | ' ' | Separatore usato quando $targetName è un array di colonne. |
$tree | mixed | null | Riservato a un futuro dropdown gerarchico/ad albero rientrato - non ancora implementato; passare un valore diverso da quello predefinito genera un'eccezione. |
$dependField | string|null | null | Colonna di $targetTable su cui filtrare, confrontata con il valore corrente di $dependOn. Vedi Dropdown a Cascata / Dipendenti. |
$dependOn | string|null | null | Nome di un altro campo configurato con relation() su questa tabella, la cui selezione corrente determina il filtro qui sopra. |
$search | bool | false | Renderizza una combobox con ricerca (un campo di testo che filtra l'elenco di opzioni caricato man mano che digiti) invece di un semplice <select> - utile quando le opzioni sono decine. Si combina con $multi per ottenere chip rimovibili. |
Filtrare l'elenco delle opzioni
La forma array di $where è l'opzione predefinita sicura - semplice uguaglianza, parametrizzata:
$xcrud->relation('catid', 'categories', 'cid', 'name', ['published' => 1]);
La forma stringa è un frammento SQL grezzo per tutto ciò che un array di uguaglianze non può esprimere - è SQL fidato, scritto dallo sviluppatore, mai costruito a partire dall'input dell'utente:
$xcrud->relation('customerNumber', 'customers', 'customerNumber', 'customerName', "country = 'USA'");
Qualunque forma venga usata, l'intera configurazione della relazione - tabella, colonna id, colonna/e nome, where, ordine, multi - viene firmata con HMAC usando XcrudConfig::$appSecret allo stesso modo di un filtro where() di base, così non può essere ridiretta o ampliata modificando nulla lato client.
subselect(): una colonna calcolata di sola lettura
Dove relation() risolve una chiave esterna modificabile, subselect() aggiunge una colonna di sola visualizzazione calcolata da un'espressione SQL correlata arbitraria - non vi viene salvato nulla, e non è mai modificabile, ordinabile o cercabile.
$xcrud->subselect(
'orderCount',
'SELECT COUNT(*) FROM orders o WHERE o.customerNumber = payments.customerNumber'
);
$field diventa una nuova colonna accanto a quelle reali della tabella e deve essere un identificatore valido che non sia già il nome di una colonna reale. $sql è SQL fidato, scritto dallo sviluppatore - come la stringa grezza $where di relation(), viene firmato con HMAC usando XcrudConfig::$appSecret quando la pagina viene renderizzata e riverificato a ogni richiesta, così un visitatore non può manometterlo, ma non viene mai validato o eseguito in sandbox rispetto a ciò che scrivi - mantienilo sempre scritto lato server, mai assemblato a partire dall'input della richiesta.
Dropdown a cascata
$dependField/$dependOn fanno sì che le opzioni di un dropdown di relazione si filtrino in base al valore attualmente selezionato di un altro campo sullo stesso modulo - ad es. un dropdown Città che offre solo le città del Paese attualmente selezionato. Vedi Dropdown a Cascata / Dipendenti per la guida completa, incluse le catene a più livelli.