PHP ordina una matrix per cognome separata da spazio bianco in modx

Ho una tabella mysql che assomiglia a questo:

id author public image1 image2 image3 bio media1 media2 media3 media4 media5 media6 

Il field "author" normaly ha Firstname (Secondname) Lastname separato da whitespaces. Come posso ordinare l'arrays dopo il cognome e se è presente un solo nome dopo questo.

Questa è la query modx che uso per ordinare dopo l'autore ma ovviamente non usa il cognome.

  $c = $modx->newQuery('AuthorDe'); $c->sortby('author','ASC'); $authors = $modx->getCollection('AuthorDe',$c); 

Ti stai sparando al piede proprio ora, per un paio di motivi:

  • Quando c'è solo una parola nella string, l'sorting è difficile da prevedere.
  • Hai indici per i tuoi dati per un motivo. Lo rendono molto più veloce. L'uso delle funzioni di string forza la scansione di una tabella. Abbastanza buono per 100 unità di dati, lento per 10000 righe e 'database andato in vacanza' a 1000000.
  • La prossima volta che devi utilizzare il field autore e ti rendi conto che devi dividerlo in parole devi anche capire e correggere questo frammento di codice sopra a quelli vecchi.

Detto questo, non l'ho provato, ma prova questo:

 $c->sortby('substring_index(author," ",-1)','ASC'); 

Quindi, per elaborare il punto molto prezioso che è stato fatto, mettere più punti di dati in una colonna di database è controproducente. L'sorting che si desidera eseguire sarebbe semplice, veloce ed efficiente, in una query sql (utilizzando lo stesso costrutto jous mostrato ma senza l'operazione string).
Per modificare questa tabella devi semplicemente aggiungere le seguenti colonne alla tua tabella al posto dell'autore:
nome di battesimo
cognome
secondo nome

Per mostrarti quanto sia semplice (e renderlo ancora più semplice) ecco il codice per farlo:

 ALTER TABLE [tablename] ADD COLUMN firstname varchar(32) ADD COLUMN lastname varchar(32) ADD COLUMN middlename varchar(32) DROP COLUMN author; 

Quindi il codice PHP modx sarebbe:

 $c->sortby('lastname','ASC'); 

Quindi questo è abbastanza facile … e se hai ancora bisogno di supportre altri riferimenti all'autore allora crea una vista che restituisce l'autore nello stesso modo in cui la tabella non alterata ha fatto come mostrato di seguito (NOTA: dovresti comunque cambiare riferimento al nome della tabella in modo che punti alla vista anziché alla tabella … se questo sarà un grosso problema, rinominare la tabella e denominare la vista come la vecchia tabella era …):

 CREATE VIEW oldtablename AS SELECT firstname+' '+middlename+' '+lastname' ' AS author FROM newtablename; 

NOTA: se crei una vista come quella riportta sopra, probabilmente vale la pena aggiungere tutte le altre colonne dalla nuova tabella (le colonne multiple di immagini e supporti). NOTA2: Aggiungerò, tuttavia, che quelli sarebbero idealmente in tabelle separate con un tavolo join per questo … ma se fossi al tuo posto potrei essere d'accordo sul fatto che espediente potrebbe battere l'utilità e l'usabilità futura …. tuttavia se li hai messi in tabelle diverse potresti aggiungere quelle tabelle a questa vista (come si aggiunge alla nuova tabella) ed essere ancora in grado di supportre il codice esistente che dipende dalla vecchia tabella e dalla sua struttura.

Mentre quanto sopra è tutto abbastanza semplice e functionrà con piccoli aggiustamenti da parte tua, l'ultima parte di questo è far sì che le modifiche alla tabella personalizzata vengano riflesse da xPDO. Se sei già a tuo agio con questo e sai cosa fare allora fantastico. Se non sei questo è di gran lunga il miglior articolo sul tema: http://bobsguides.com/custom-db-tables.html

(Sì, vale la pena get il codice di Bob come snippet in modo che tutto ciò possa essere generato per te una volta che le modifiche al database sono state apportte … (ricorda che probabilmente dovrai eliminare il file dello schema esistente e i file di class e la mappa relativi a xpdo file prima di eseguire il codice di generazione di Bob, o le modifiche che hanno lo stesso nome di tabella, come la vista, non avranno effetto).

Spero che questo ti aiuti (o la prossima persona a porre una domanda simile).