Puncte:0

obțineți în mod programatic nodurile copil care fac referire la uuid părinte după referință de entitate, folosind loadByProperties și entityTypeManager sau alt mod fără vizualizări

drapel cn

Am incercat acest raspuns:

https://drupal.stackexchange.com/a/298084/1082

Dar se pare că nu pot folosi

'field_scientists' => $entity_reference_uuid

unde, in cazul meu, oameni de știință de câmp este un câmp de tip Entity Reference UUID - care este un tip de câmp furnizat de https://www.drupal.org/project/entity_reference_uuid modul

Ce se întâmplă cu mine este că nu primesc nimic înapoi, matricea mea de rezultate din acel exemplu este goală.

Vreau să fac asta în mod programatic în modul meu personalizat, mai degrabă decât să folosesc o vizualizare Drupal.

Dacă există o altă cale, de ex. care folosește ->interogare metodă de interogare a bazei de date, aș fi bucuros să folosesc această abordare programatică.

Mulțumesc.

Actualizați

Un exemplu de a uuid de a nodul in cazul meu este BMSSYS0000051988.

Acest lucru a fost setat într-un import de migrare dintr-un câmp dintr-un CSV.

Incercarile mele sunt:

1. pe baza exemplului din cealaltă întrebare: https://drupal.stackexchange.com/a/298084/1082

  $noduri = \Drupal::entityTypeManager()->getStorage('nod')->loadByProperties([
    'type' => 'bol',
    'field_parent_uuid' => $taxonkey,
  ]);

2. interogare db

$interogare = \Drupal::entityQuery('nod')
->condition('status', NODE_PUBLISHED)
->condition('tip', 'bol');
$și = $interogare->andConditionGroup();
$and->condition('field_parent_uuid', $taxonkey);
$interogare->condiție($și);
$rezultat = $interogare->execute();

Unde $taxonkey este BMSSYS0000051988

ambele 1 și 2 încercări de mai sus returnează o matrice goală.

Actualizare 2

aici este configurația mea de migrare care arată că uuid este scris dintr-un câmp din csv. Este legal acest lucru? Ar trebui codul unui dezvoltator să modifice valoarea uuid sau ar trebui uuid să fie gestionat numai de nucleul Drupal?

dependențe: { }
id: bol_csv_import
clasa: nula
field_plugin_method: null
cck_plugin_method: nul
migration_tags: null
migration_group: defaultl: publicbins
etichetă: „Importați date despre speciile bol”
sursă:
  plugin: csv
  cale: ./data/taxonomy_species_with_unpacked_bold.csv
  delimitator: ','
  incintă: '"'
  header_offset: 0
  ID-uri:
    - uuid
  câmpuri:
    -
      nume: uuidl: publicbins
      etichetă: „NBN id”
    -
      nume: parent_uuid
      etichetă: „ID NBN al părintelui”
    -
      nume: nume
      etichetă: Nume
    -
      nume: rang
      etichetă: „Rang taxonomic”
    -
      nume: taxon_key
      etichetă: „Cheie taxonului”
    -
      nume: autoritate
      etichetă: autoritate
    -
      nume: specimenrecords
      etichetă: specimenrecords
    -
      nume: înregistrări publice
      etichetă: publicrecords
    -
      nume: publicbins
      etichetă: pubele publice
    -
      nume: taxid
      etichetă: „NBN Taxon ID”
proces:
  numele titlului
  uid:
    plugin: default_value
    valoare_default: 1
  uuid: uuid
  field_parent_uuid: parent_uuid
  field_taxon_key: cheie_taxon
  field_authority: autoritate
  field_rank: rang
  field_num_bold_barcode_specimens: specimenrecords
  field_num_bold_public_records: publicrecords
  field_num_bold_public_bins: publicbins
  field_bold_taxon_id: taxid
  tip:
    plugin: default_value
    default_value: bol
destinaţie:
  plugin: 'entity:node'
dependențe_migrație: nul

Actualizare 3

Voi scrie o interogare db pentru a rezolva această problemă. Rularea unei linii de comandă sql indică că această abordare ar putea funcționa:

MariaDB [db]> select * din nodul unde nid = 246;
+-----+------+------+-----------------+---------- +
| nid | vid | tip | uuid | langcode |
+-----+------+------+-----------------+---------- +
| 246 | 248 | bol | NBNORG0000041189 | ro |
+-----+------+------+-----------------+---------- +
1 rând în set (0,001 sec)
4uk4 avatar
drapel cn
`BMSSYS0000051988` nu este un [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier).
drapel cn
+1 Mulțumesc @4uk4 care ar putea fi util „uuid” a fost setat ca acela în migrare. Când fac `$node->uuid();`, atunci `BMSSYS0000051988` este ceea ce primesc înapoi. Știți dacă `uuid` ar trebui să fie setat de propriul cod al dezvoltatorului sau ar trebui să fie setat doar de Drupal Core?
drapel cn
Am adăugat configurația de migrare la întrebarea mea pentru a arăta cum a fost scris uuid cu `BMSSYS0000051988`. Dacă acest lucru este „ilegal”, în sensul că numai nucleul Drupal ar trebui să gestioneze și să creeze/scrie „uuid”, atunci asta ar promova strategia mea b) de a implementa o soluție pentru a evita utilizarea uuid-ului în acest fel: https://drupal.stackexchange .com/questions/310697/programmatically-get-child-nodes-referencing-parent-by-entity-reference-uuid-us?noredirect=1#comment395034_310699
4uk4 avatar
drapel cn
Nu, nu este că numai nucleul Drupal ar trebui să gestioneze UUID-urile. Unul dintre principalele puncte de vânzare este că UUID-urile sunt unice în întreaga lume, așa că le puteți migra de la site la site și rămân unice. Dar nu aș folosi câmpul UUID pentru alte date decât UUID-uri. Puneți valoarea non-UUID în propriul câmp și utilizați UUID-urile pentru a încrucișa elementele de date din sursa și/sau destinația migrării. Unde creați UUID-urile nu contează.
drapel cn
+1 de acord. Aș prefera ca migrarea să nu fi importat acele date de câmp în `uuid` și în schimb un alt câmp obișnuit.Cu toate acestea, trebuie să lucrez cu ceea ce am, așa că în „Actualizarea 3”, voi scrie o interogare db.
Puncte:0
drapel cn

În teorie, acest lucru ar trebui să funcționeze, tipul de câmp setează UUID-ul ca proprietate principală: EntityReferenceUuidItem:: mainPropertyName()

S-ar putea ca Drupal să fie confuz și să gestioneze câmpul ca un câmp de referință standard pentru entitate, deoarece extinde tipul de câmp de bază.

Pentru a clarifica proprietatea câmpului pe care o interogați, adăugați-o cu un punct:

'field_scientists.target_uuid' => $entity_reference_uuid

Care ar trebui să funcționeze pentru ambele, loadByProperties sau o interogare de entitate:

->condition('field_scientists.target_uuid', $entity_reference_uuid)

Prima este doar o scurtătură pentru a doua folosind același motor de interogare.

drapel cn
Voi încerca asta, în această dimineață și voi reveni la tine - mulțumesc până acum.
drapel cn
Nefericit mi-e teamă. Array a revenit încă gol.
drapel cn
Pe baza că abordarea „condiției” se rezumă la același motor de interogare, aș fi înclinat să nu încerc și asta, anticipând aceeași problemă, în loc să fac două lucruri: a) ridicați erori pe https://www.drupal.org/project/entity_reference_uuid și b) implementează o soluție, creează un câmp nou în tipul meu de conținut, care este o referință simplă de entitate veche (nu cu uuid), completează cu o referință la un nod și testează din nou codul. Dacă funcționează, scrieți scriptul pentru a popula restul nodurilor (există totuși 100K dintre ele). Popularea va folosi valoarea câmpului ref uuid al entității existente pentru a găsi nodul pentru noul câmp.
4uk4 avatar
drapel cn
Există vreo modalitate de a reproduce problema la o instalare nouă? Nu am putut. Pentru mine funcționează cu și fără numele proprietății adăugate.
4uk4 avatar
drapel cn
b) ca o soluție, nu aș genera date suplimentare. În schimb, aș scrie SQL de nivel scăzut. Acesta este, de asemenea, un test bun dacă UUID-ul pe care îl interogați există într-adevăr. Nivel scăzut, aceasta este o interogare simplă pe un singur tabel.
drapel cn
Notat, mulțumesc @4uk4. Configurația mea pare ciudată. Privind câmpul uuid de referință al entității din nod, este un șir, a cărui valoare este dintr-un câmp care a fost importat dintr-un CSV. În modul de editare, câmpul este afișat ca titlul nodului părinte cu id-ul nodului său între paranteze. În momentul de față, sunt nedumerit cum acea valoare a șirului poate face referire la nodul părinte. Privind modulul UUID de referință la entitate, nu am găsit nicio configurație și nici în câmpul care să ofere un indiciu. Nu știu ce câmp este desemnat ca UUID. Câteva piese lipsă din puzzle pentru mine.
drapel cn
Cred că trebuie să înțeleg cum să obțin uuid-ul unui nod pentru a mă ajuta să înțeleg.
4uk4 avatar
drapel cn
`$uuid = $nod->uuid();`
drapel cn
+1 vă mulțumesc da, @4uk4 și exemplu `uuid` în cazul meu pentru că este `BMSSYS0000051988`. Mi-am actualizat și întrebarea, cu informații suplimentare despre ceea ce încerc. Vă mulțumesc pentru tot ajutorul dvs.
drapel cn
se pare că este o confuzie a mea între valoarea datelor dintr-un câmp obișnuit și uuid. deci răspunsul tău este valid și sunt de acord că ar trebui să funcționeze. Voi scrie mai multe informații mai târziu.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.