/

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

ParametroTipoPredefinitoDescrizione
$fieldstring-La colonna reale e modificabile di questa tabella da collegare (ad es. customerNumber).
$targetTablestring-La tabella in cui cercare i valori.
$targetIdstring-Colonna di $targetTable il cui valore viene salvato in $field.
$targetNamestring|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".
$wherearray|string|nullnullRestringe 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.
$orderBystring|nullnullOrdinamento dell'elenco delle opzioni.
$multiboolfalseRenderizza una selezione multipla invece di un singolo dropdown; il valore salvato diventa un elenco di id separati da virgola.
$concatSeparatorstring' 'Separatore usato quando $targetName è un array di colonne.
$treemixednullRiservato a un futuro dropdown gerarchico/ad albero rientrato - non ancora implementato; passare un valore diverso da quello predefinito genera un'eccezione.
$dependFieldstring|nullnullColonna di $targetTable su cui filtrare, confrontata con il valore corrente di $dependOn. Vedi Dropdown a Cascata / Dipendenti.
$dependOnstring|nullnullNome di un altro campo configurato con relation() su questa tabella, la cui selezione corrente determina il filtro qui sopra.
$searchboolfalseRenderizza 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.

$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.